- 动态代理就是将一个对象调用方法时,将这些方法都转成指定InvocationHandle的invoke方法来执行
- 以下为代码,具体讲解穿插在代码中
//这个程序在p对象执行两个方法的时候都将方法转化成了invoke方法来执行 package Chapter_5; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Person{ void talk(); void sayHello(String name); } class MyInvocationHandler implements InvocationHandler{ /*当执行动态代理对象的所有方法的时候,都会被替换成下面的invoke方法, * 其中: * proxy:正在动态代理的对象 * method:正在执行的方法 * args:代表目标方法的参数 * */ public Object invoke(Object proxy, Method method, Object[] args){ System.out.println("----正在执行的方法:" + method); if (args != null){ System.out.println("下面是执行该方法时传入的实参: "); for(Object val : args){ System.out.println(val); } }else { System.out.println("调用该方法没有实参!"); } return null; } } public class ProxyTest { public static void main(String args[]){ InvocationHandler handler = new MyInvocationHandler(); // 创建一个InvocationHandler(调用句柄)对象 Person p = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler); // 使用指定的InvocationHandler对象来生成一个动态代理对象 p.talk(); p.sayHello("jaja"); } } //执行程序,看到输出 // ----正在执行的方法:public abstract void Chapter_5.Person.talk() // 调用该方法没有实参! // ----正在执行的方法:public abstract void Chapter_5.Person.sayHello(java.lang.String) // 下面是执行该方法时传入的实参: // jaja
这是我看李刚编著的《疯狂Java讲义》后总结出来的。
java反射(7) 动态代理
最新推荐文章于 2024-01-06 17:45:46 发布