您的位置 首页 java

java设计模式JDK动态代理

动态代理: 代理类并不是在java代码中实现,而是在运行期间生成。相比静态代理,它可以很方便被代理类的方法统一处理,如添加方法调用次数,日志功能等等。分为 JDK 动态代理和 cglib 动态代理。

JDK动态代理: (1) 代理对象不需要实现接口 (2) 代理对象的生成,利用JDK的API动态的在内存中生成。(需要我们指定创建代理对象/目标对象接口类型)

JDK动态代理API: (1) java .lang.reflect.Proxy 主类,它提供了一组 静态方法 来为接口生成代理类及对象。 (2) java.lang .reflect.InvocationHandler 调用处理器接口,它定义了一个invoke方法,用于集中处理动态代理类对象上的方法调用。通常在该方法上实现被代理对象的访问。即用来指明产生的代理对象要做什么事情。

例如: 使用 Proxy的 newProxyInstance方法,生成动态代理对象。Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this) 其参数: 1 目标对象加载器 2 目标对象接口 3 返回this

 /**
 * @date: 2022/6/4 20:37
 * @desc: 被代理对象接口
 */public interface ISay {
     void  say();
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * @date: 2022/6/4 20:40
 * @desc: 动态代理对象
 */public class ProxyInvocation implements InvocationHandler {
     private  Object targetObj;
    public Object bindObj(Object p_targetObj) {
        targetObj = p_targetObj;
        // 1 目标对象加载器 2 目标对象接口 3 返回this
        return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this);
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(targetObj, args);
    }
}
/**
 * @date: 2022/6/4 20:38
 * @desc: 被代理对象
 */public class Say implements ISay {
    public void say() {
        System.out.println("目标方法输出的内容");
    }
}
        // 测试代码
        ISay say = (ISay)new ProxyInvocation().bindObj(new Say());
        say.say();  

文章来源:智云一二三科技

文章标题:java设计模式JDK动态代理

文章地址:https://www.zhihuclub.com/191391.shtml

关于作者: 智云科技

热门文章

网站地图