动态代理

主要类和方法

  1. InvocationHandler接口
    1. 实现该接口
    2. 声明被代理对象obj,声明绑定obj的方法
    3. 重写的invoke在代理类调用方式时自动调用
    4. 在重写的invoke方法中调用obj中的方法
  2. Proxy类

    1. newProxyInstance静态方法,传入构造器、被代理类实现的接口数组,和InvocationHandler的实现类的实例。
    2. 返回代理类,以供调用

      两个问题

  3. 如果根据被加载到内存中的被代理类,动态的去创建一个代理类和其对象

  4. 当通过代理类的对象调用方法的时候,如果动态的去调用被代理类中的同名方法。 ```java public class test { public static void main(String[] agrs){

    1. //声明被代理类
    2. NikeFactory nikeFactory = new NikeFactory();
    3. //获取代理类
    4. Factory factory = (Factory)

    ProxyFactory.proxy(nikeFactory);

    1. String result = factory.product();
    2. System.out.println(result);

    } } //接口 interface Factory{ String product(); } //被代理类 class NikeFactory implements Factory{ @Override public String product() {

    1. System.out.println("生产一百双鞋子");
    2. return "100";

    } } //实现接口解决问题二 class MyInvocation implements InvocationHandler{ //被代理类对象 private Object object; //绑定被代理类对象 public void bind(Object object){

    1. this.object = object;

    } //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法invoke() @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    1. return method.invoke(object, args);

    }

} //动态创建代理类 class ProxyFactory { //调用此方法返回一个代理类对象,解决问题一。obj被代理类的对象。 public static Object proxy(Object obj){ MyInvocation hInvocation = new MyInvocation(); hInvocation.bind(obj); return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), hInvocation); } } ```