1、概述
1.1 在Java.lang.reflect包下,提供了Proxy类、InvocationHandler接口,使用它们可以生成JDK动态代理类或动态代理对象;
1.2 【Proxy类】
1.1.1 Proxy类是所有动态代理类的父类;
1.1.2 Proxy类提供 用于创建动态代理类、动态代理对象的静态方法;
1.1.3 在程序中,为 一个或多个接口 动态地生成实现类,可以使用Proxy创建动态代理类;
为 一个或多个接口 动态地生成实例,可以使用Proxy创建动态代理对象;
1.1.4 创建动态代理类、动态代理对象的方法
a, public static Class<?> getProxyClass(ClassLoader loader,Class<?>... interfaces)
创建一个动态代理类 所对应的Class对象,该代理类将实现interfaces所指定的所有接口;
loader:指定生成动态代理类的类加载器;
b, public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
直接创建一个 动态代理对象,该代理对象的实现类 实现了interfaces指定的所有接口;
*****执行代理对象的每个方法时 实际上都是 执行InvocationHandler对象的invoke方法;
2、案例
package com.exiuge.mytest.dongtaidaili; public interface Person { void say(String s); void walk(); }
package com.exiuge.mytest.dongtaidaili; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvokationHandler implements InvocationHandler { /** * 执行代理对象的方法时,都会被替换成执行下面的invoke方法 * @param proxy 动态代理对象 * @param method 正在执行的方法 * @param args 执行代理对象的方法的传入参数 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("正在执行的代理对象的方法:"+method); if (args!=null){ System.out.println("正在执行的代理对象的方法的传入参数"); for (Object o:args) { System.out.println(o); } }else { System.out.println("正在执行的代理对象的方法没有传入参数"); } return null; } }
package com.exiuge.mytest.dongtaidaili; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args){ //创建自定义的InvocationHandler InvocationHandler invocationHandler=new MyInvokationHandler(); //生成指定接口的动态代理对象 Person person=(Person)Proxy.newProxyInstance(Person.class.getClassLoader(),new Class[]{Person.class},invocationHandler); person.say("hello"); person.walk(); } }
执行结果: