关于java中的动态代理.

2019-05-15  本文已影响0人  励志做一名老中医

1. 什么是动态代理?

代理模式为一种设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理

动态代理的意思就是在程序运行时生成委托类的代理类来实现增强的功能。

2. 动态代理有哪些实现方式?

2.1 jdk本身自带的动态代理类。

由JVM在程序运行时生成代理类,使用java反射机制。
public class MyInvocationHandler implements InvocationHandler {

    private Object target;
    
    // 通过此方法可以生成委托类的代理类,原理通过传入的委托类的对象的类加载器生成一个代理类对象 
    public Object bind(Object target, Class[] interfaces) {
        this.target = target;
        //取得代理对象,通过被代理对象的类加载器,生成代理对象
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                interfaces, this);
    }

    // 通过此方法增强委托类中的方法
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("增强内容前!");
        Object invoke = method.invoke(target, args);
        System.out.println("增强内容后!");
        return invoke;
    }
}


--------------------------------------------------------------------------------------------------------------------------------------------
    public static void main(String[] args) {
        MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
        TestInterface test = new com.thunisoft.casespace.common.dtdl.Test();
        TestInterface bind =(TestInterface) myInvocationHandler.bind(test, new Class[]{TestInterface.class});
        bind.test();
        bind.test2();
    }

2.2 ASM、cglib(基于 ASM)、Javassist 等方式

该方式后续在补充。
AccessibleObject.setAccessible方法,可以在运行时更改类属性的作用域,可以通过他绕开类的api访问控制.

上一篇 下一篇

猜你喜欢

热点阅读