Java JDK原生动态代理

博客介绍了JDK原生动态代理。动态代理类需实现InvocationHandler接口,调用代理对象方法会转发到invoke方法。还需用到Proxy类,用newProxyInstance方法动态创建代理对象,无需编写大量代理类,不过被代理类要实现接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK原生动态代理

动态代理是指动态的在内存中构建代理对象

话不多说,直接上代码~

public interface DataService {
    public void connection();
}

public class DataServiceImpl implements  DataService{
    @Override
    public void connection() {
        System.out.println("02:数据库建立连接~");
    }
}

public class DynamicProxy implements InvocationHandler {

    //要代理的真实对象
    private Object object;


    public  Object newInstanceDynamic(Object object){
        this.object=object;

        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);

    }


    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        //拦截前的操作
        System.out.println("操作前进行入参的打印");
        method.invoke(object,args);
        //拦截后的操作
        System.out.println("操作后进行参数的加密处理");
        return null;
    }
}

//动态代理的调用
 class toImpl{
    public static void main(String[] args) {
        DataServiceImpl dataService=new DataServiceImpl();
        DataService dynamic=(DataService)new DynamicProxy().newInstanceDynamic(dataService);
        System.out.println(dynamic.getClass().getName());
        dynamic.connection();

        //控制台输出
        /**
        * com.sun.proxy.$Proxy0
         * 操作前进行入参的打印
         * 02:数据库建立连接~
         * 操作后进行参数的加密处理
        *
        **/
    }
 }

动态代理小讲堂

  • 一:动态代理类需要实现InvocationHandler接口
    • 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
    • invoke方法接收到的三个参数分别代表什么意思呢?
    • Object invoke(Object proxy, Method method, Object[] args) throws Throwable
传入参数参数的含义
proxy传入的是被代理的那个目标的对象
method被代理目标对象的某个方法
args目标对象某个方法的传入的参数列表
  • 二:需要用到Proxy类,这个类主要是用来动态创建一个代理对象的类,一般使用newProxyInstance 这个方法
    • public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException
传入参数参数的含义
loader表示由哪个ClassLoader 类加载器来生加载动态代理类
interfaces被代理对象的接口数组,动态代理类实现了被代理对象的接口,那么就可以调用这组接口中的方法了
handler象表示的是在调用动态代理类的时候,被关联到哪个InvocationHandler对象上,用来定位到某个动态代理类上

动态代理类的总结

  • 不需要编写大量的动态代理类,不需要维护目标对象和相应的接口
  • 被代理类一定需要实现接口,所以是在接口的基础上实现的动态代理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值