java动态代理:再反射类中有产生代理对象的方法,直接拿来利用。 |
首先对于接口Dog.java
package 动态代理; public interface Dog { public void run(); public void jump(); }
实现类:
package 动态代理; public class Dog2 implements Dog { @Override public void run() { // TODO Auto-generated method stub System.out.println("这里执行的是run方法"); } @Override public void jump() { // TODO Auto-generated method stub System.out.println("这里执行的是jump方法:"); } }代理类
package 动态代理; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //程序中生成动态代理对象可以先生成一个动态代理类,然后通过动态代理类来创建dialing对象的方式来生成一个动态代理对象, public class ProxyAndInvocationHandler implements InvocationHandler{ /*执行代理对象所有的方法都会去执行invoke方法,其中: proxy代表动态代理对象 method代表执行的方法 args-代表执行对象方法时传入的实参*/ @Override public Object invoke(Object proxy, Method method, Object[] arg2) throws Throwable { // TODO Auto-generated method stub System.out.println("正在执行的方法:"+method); return null; } }
测试类:
package 动态代理; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { //下边这三句是测试实现接口的; Dog dog1=new Dog2(); dog1.jump(); dog1.run(); //下边是是测试动态代理的 //创建一个invocationHandler对象 InvocationHandler invocationHandler=new ProxyAndInvocationHandler(); //使用一个指定的InvocationHandler来生成一个动态代理对象 Dog dog=(Dog) Proxy.newProxyInstance(Dog.class.getClassLoader(), new Class[]{Dog.class}, invocationHandler); //调用动态代理的run和jump方法,这里执行方法的时候,先将方法以method形式传入到invoke方法中,作为方法参数,然后执行invoke方法 dog.jump(); dog.run(); } }
控制台打印如下: