在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动态代理