首页 > 其他 > 详细

jdk动态代理

时间:2021-05-21 12:10:36      阅读:14      评论:0      收藏:0      [点我收藏+]
// 1.必须要有接口方法
public interface TargetClass {

    void sayHello();

    int add(int a, int b);
}

// 2.目标对象实现了接口方法
public class TargetClassImpl implements TargetClass {
    public void sayHello() {
        System.out.println("hi dynamic proxy");
    }

    public int add(int a, int b) {
        return a+b;
    }
}

// 3. 实现了InvocationHandler接口的辅助类,该类必须持有自动生成的代理类的对象引用,需要借助该类来增强和调用目标对象的方法
    /**
     * @param proxy  代理类对象的引用
     * @param method 目标类方法
     * @param args   目标类方法参数
     * @return 目标类方法的返回值
     * @throws Throwable
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("我是在方法之前执行的方法");

        Object invoke = method.invoke(obj, args);

        System.out.println("我是在方法之后执行的方法");
        return invoke;
    }
//4.将目标类作为参数生成代理类,执行代理类的目标方法
public class Action {
    public static void main(String[] args) {
        TargetClassImpl targetClass = new TargetClassImpl();
        // 用Proxy类的静态方法生成一个实际的代理类,并强转成目标类型,newProxyInstance方法需要传入一个目标类的实例供代理方法使用
        TargetClass proxyInstance = (TargetClass) Proxy.newProxyInstance(targetClass.getClass().getClassLoader(), new Class[]{TargetClass.class}, new SecondProxyClass(targetClass));

        proxyInstance.sayHello();
        int add = proxyInstance.add(2, 5);
        System.out.println(add);

    }

}

执行结果
技术分享图片

jdk动态代理

原文:https://www.cnblogs.com/python99/p/14792851.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!