JDK动态代理

匿名 (未验证) 提交于 2019-12-03 00:30:01

在java的java.lang.reflect包下提供了Proxy类和InvocationHandler接口,通过使用这个类和接口可以生成JDK动态代理类或动态代理对象

关于Proxy类的介绍:

Proxy 提供了俩个方法来创建动态代理类和动态代理实例:

- public static Class<?> getProxyClass(ClassLoaderClass:创建一个动态代理类所对应的Class对象,该代理类将实现interfaces所指定的多个接口。第一个ClassLoader参数指定成动态代理类的类加载器

-public static Object newProxyInstance(ClassLoaderClassInvocationHandler直接创建一个动态代理对象,该代理对象的实现类实现了interfaces指定的系列接口,执行代理对象的每个方法时都会被替代执行InvocationHandler对象的invoke方法。

关于InvocationHandler接口的介绍:

InvocationHandler 接口是代理实例的调用处理程序 实现的接口;

该类只有一个方法:Object invoke(ObjectMethodObject在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。



定义一个接口:

public interface Person {      void walk();     void sayHello(String name); }

实现InvocationHandler 接口的类
public class MyInvokationHandler implements InvocationHandler {      /*       执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法       其中:       proxy:代表动态代理对象       method:代表正在执行的方法       args:代表调用目标方法时传入的实参       */      @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {         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 MyInvokationHandler();          Person p=(Person) Proxy.newProxyInstance(Person.class.getClassLoader(),new Class[]{Person.class},handler);          p.walk();         p.sayHello("孙悟空");       }  








文章来源: JDK动态代理
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!