JDK动态代理

动态代理的关键就是获取代理对象,获取代理对象呢又是根据JDK提供的Proxy这个类提供的方法,这个方法的参数就是需要知道被代理对象的类加载器是哪个?实现的接口是哪些?然后利用InvocationHandler这个类用反射的方式调用被代理对象的方法,代码如下:

/**
 * 声明一个接口
 */
interface Human {
    public void study();
}

/**
 * 被代理对象
 */
class SuperMan2 implements Human {
    public void study() {
        System.out.println("超人也是需要学习的,要么迟早会被淘汰!");
    }
}

/**
 * 获取代理对象的静态方法
 */
class HumanProxy {
    public static Object newInstanceProxy(Object object) {
        InvocationHandler invocationHandler = new MyInvocationHandler(object);
        return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), invocationHandler);
    }
}

/**
 * 执行静态方法调用
 */
class MyInvocationHandler implements InvocationHandler {

    /**
     * 怎么传入实例对象呢,构造方法或者写一个方法都行
     */
    private Object object;

    /**
     * 利用构造方法传入被代理对象
     *
     * @param object
     */
    public MyInvocationHandler(Object object) {
        this.object = object;
    }

    /**
     * 需要传入一个被代理对象的实例
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("在学习之前最好先吃点早点,要么身体扛不住!");
        Object invoke = method.invoke(object, args);
        System.out.println("学习之后呢,要先及时进行练习,总结,就像现在!!");
        return invoke;


    }
}

public class ProxyTest2 {

    @Test
    public void test() {
        //获取代理对象
        Human o = (Human) HumanProxy.newInstanceProxy(new SuperMan2());
        o.study();


    }
}

输入结果:

在学习之前最好先吃点早点,要么身体扛不住!
超人也是需要学习的,要么迟早会被淘汰!
学习之后呢,要先及时进行练习,总结,就像现在!!

 

JDK动态代理JDK动态代理 圣殿骑士^_^ 发布了2 篇原创文章 · 获赞 2 · 访问量 5392 私信 关注
上一篇:Unity Invoke定时器的使用


下一篇:JDK Proxy与UndeclaredThrowableException不可不说的关系