标签:
通过例子查看,首先建立一个实现动态代理的接口Interface1.java,代码如下:
package my.spring.fuck.aoptest; public interface Interface1 { public void say_hello(); }
很简单的一个接口,然后定义一个这个接口的实现类MyImple.java,代码:
package my.spring.fuck.aoptest; public class MyImple implements Interface1{ @Override public void say_hello() { System.out.println("hello world"); } }
下面就是我们要创建的代理类了,创建代理类后就完成了动态代理,是最重要的一步了(ps:虽然这里说代理类,但它并不是Proxy类,看代码后可以看出这个类实现了java.lang.reflect.InvocationHandler接口,InvocationHandler的意思是:“调用处理程序”,意思就是我们实现了动态代理后,是由这个类来处理的,而真正的代理类是java.lang.reflect.Proxy类,好吧,有点绕嘴,代理里有详细注释),代码如下:
package my.spring.fuck.aoptest; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //此类实现了InvocationHandler接口,通过API查看,此接口只有一个方法,即下面重写的invoke方法,下面有详细注释 public class MyProxy implements InvocationHandler{ Object object1;//用来存放被代理的类,本例子中指MyImple.java //bind=绑定,是我们自定义的方法,这个方法的形参是Object类型,用来接收被代理类,本例子中是MyImple.java,然后返回一个Proxy类,方法里有详细注释 public Object bind(Object someObject){ this.object1=someObject; return Proxy.newProxyInstance(object1.getClass().getClassLoader(),object1.getClass().getInterfaces(), this); //Proxy=代理,本方法返回一个Proxy类的实例,通过对这个实例操作,即可实现动态代理,看一下上面的三个参数,参数1是类加载器,参数2是被代理的对象,参数3 //是代理的处理程序,通过此方法来获取对象的代理(Proxy),代理中存储了执行方法时候的处理程序(本例中就是本Class,即MyProxy,是一个实现了InvocationHandler接口的类) } //下面的方法(invoke)是接口InvocationHandler中的方法,在代理调用此类时,此类调用invoke方法; //invoke也是java.lang.reflect.Method中的一个方法,每个类的每个方法都属于Method类,这里不再赘述 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //此方法的3个参数分别代表代理类,方法,方法的参数列表,由系统自动赋值 System.out.println("AOP 动态代理,在方法执行前的处理"); Object return_obj=method.invoke(object1, args);//执行被代理类的本来的方法 System.out.println("AOP 动态代理,在方法执行后的处理"); return return_obj; } public static void main(String[] args){ MyProxy myProxy=new MyProxy(); Interface1 proxy=(Interface1)myProxy.bind(new MyImple()); proxy.say_hello(); } }
运行Myproxy类,控制台输出如下图:
标签:
原文地址:http://www.cnblogs.com/juson37/p/5910124.html