java 动态代理
1、一、打开eclipse,创建一个普通java工程dynamicAgent 具体步骤为: File -> New -> java Project,写好工程名,finish结束

3、三、写一个StudentImpl类来实现Student接口具体步骤为: 鼠标包名 -> Class ,写好类名StudentImpl,finish结束具体代码为:package dynamicAgent;public class StudentImpl implements Student { @Override public String getStudentName(String stuName) { return stuName; } @Override public String getStudentSex(String stuSex) { return stuSex; } @Override public int getStudentAge(int stuAge) { return stuAge; }}


6、六,若不用动态代理,我们就要去修改StudentImpl,因为这个类是具体实现方法的,而我们需要日志跟踪每个方法的开始和结束,这样做也能实现上述的显示具体代码为:package dynamicAgent;public class StudentImpl implements Student { @Override public String getStudentName(String stuName) { System.out.println("这个方法getStudentName开始了,正在获取,请稍等..."); String name=stuName; System.out.println("这个方法getStudentName结束了,获取完毕"); return name; } @Override public String getStudentSex(String stuSex) { System.out.println("这个方法getStudentSex开始了,正在获取,请稍等..."); String sex=stuSex; System.out.println("这个方法getStudentSex结束了,获取完毕"); return sex; } @Override public int getStudentAge(int stuAge) { System.out.println("这个方法getStudentAge开始了,正在获取,请稍等..."); int age=stuAge; System.out.println("这个方法getStudentAge结束了,获取完毕"); return age; }}

8、八、写一个StudentProxy类来实现动态代理具体步骤为: 鼠标包名 -> Class ,写好类名StudentProxy,finish结束具体代码为:package dynamicAgent;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class StudentProxy { //要代理的对象 private Student stu; //构造器初始化要代理的对象 public StudentProxy(Student stu) { this.stu=stu; } //返回代理对象 public Student getLoggingProxy(){ Student proxy=null; ClassLoader loader=stu.getClass().getClassLoader(); Class[] interfaces=new Class[]{Student.class}; InvocationHandler handler=new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String methodName=method.getName(); System.out.println("这个方法:"+ methodName +"开始运行了,正在获取,请稍等..."); Object result=null; try { result=method.invoke(stu, args); } catch (NullPointerException e) { e.printStackTrace(); } System.out.println("这个方法:"+ methodName +"运行结束了,获取完毕"); return result; } }; /** * loader: 代理对象使用的类加载器。 * interfaces: 指定代理对象的类型. 即代理代理对象中可以有哪些方法. * handler: 当具体调用代理对象的方法时, 应该如何进行响应, 实际上就是调用 InvocationHandler 的 invoke 方法 */ proxy=(Student) Proxy.newProxyInstance(loader, interfaces, handler); return proxy; }}

10、十、这样做,代码纯净多了,还易于维护,想要修改日志,只需要去StudentProxy修改两条日志显示就OK了,感觉爽了很多,若是加入spring框架,用spring的AOP,我们连StudentProxy类都不用写了,AOP直接帮我们搞定了,这就更爽了