在「spring AOP (4) 基础知识-代理」中给大家讲解了什么是代理,有什么弊端。
java的动态代理比代理的思想更前进了一步。
首先我们要创建一个代理类,它必须实现java.lang.reflect.InvocationHandler接口。
DynamicProxyHandler:
package spring3.aop.aop3; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class DynamicProxyHandler implements InvocationHandler { // 目标对象 private Object proxied; public DynamicProxyHandler(Object proxied) { this.proxied = proxied; } /** * invoke. * * @param proxy (最终生成的)代理实例,不是目标对象(一般情况下不会用到) * @param method 要调用的方法 * @param args 要调用方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("----START----"); // method.invoke是java反射的知识 Object obj = method.invoke(proxied, args); System.out.println("----END----"); return obj; } }
接口Interface1
package spring3.aop.aop3; public interface Interface1 { public void do1(); public void do2(String str); }
接口Interface2
package spring3.aop.aop3; public interface Interface2 { public void exe1(); public void exe2(String str); }
目标对象类,Target实现了两个接口Interface1, Interface2
package spring3.aop.aop3; public class Target implements Interface1, Interface2 { @Override public void do1() { System.out.println("Target.do1()"); } @Override public void do2(String str) { System.out.println("Target.do2(" + str + ")"); } @Override public void exe1() { System.out.println("Target.exe1()"); } @Override public void exe2(String str) { System.out.println("Target.exe2(" + str + ")"); } }
基本的组件我们创建完成了,看看如何利用这些组件:
package spring3.aop.aop3; import java.lang.reflect.Proxy; public class ProxyMain { /** * @param args */ public static void main(String[] args) { Object obj = Proxy.newProxyInstance(Interface1.class.getClassLoader(), new Class<?>[] { Interface1.class, Interface2.class }, new DynamicProxyHandler(new Target())); Interface1 if1 = (Interface1) obj; if1.do1(); if1.do2("test"); Interface2 if2 = (Interface2) obj; if2.exe1(); if2.exe2("test"); } }
运行结果:
----START---- Target.do1() ----END---- ----START---- Target.do2(test) ----END---- ----START---- Target.exe1() ----END---- ----START---- Target.exe2(test) ----END----
以上就是java的动态代理,现在我来讲解下测试累的main方法
在main中
通过静态方法Proxy.newProxyInstance()来创建动态的代理。
这个方法需要三个参数:
①类加载器:可以通过已加载对象,获得类加载器。例如:Interface1.class.getClassLoader()
②希望被代理的接口列表,是个Class数组。例如:new Class<?>[] { Interface1.class, Interface2.class }
③java.lang.reflect.InvocationHandler接口的一个实现类。
动态代理就是将所有调用重定向到调用处理器(DynamicProxyHandler),一般会向调用处理器传递一个目标对象(例如:DynamicProxyHandler的构造函数public DynamicProxyHandler(Object proxied)),调用器在在执行中介任务时,将请求转发给目标对象。