java 代理之动态代理实践

  1. JDk动态代理实践
    1.1调用jdkjava.lang.reflect.Proxy 类的newProxyInstance()方法,该方法中需要传递三个参数:当前类的类加载器、所要代理的目标对象的接口、所要代理的目标对象
    在这里插入图片描述
    1.2具体代码实现
    定义接口TestDao,里面添加test1和test2方法
package com.yf.cn.dao;

public interface TestDao {
    public void test1();
    public void test2();

}

TestDaoImpl:
package com.yf.cn.dao;

public class TestDaoImpl implements TestDao {
@Override
public void test1() {
System.out.println(“test111”);
}

@Override
public void test2() {
    System.out.println("test222");
}

}
1.3查看JDK动态代理源码可知:第三个参数需要传递一个InvocationHandler对象,追踪源码可知InvocationHandler是一个接口,我们需要的是其实现类,所以我们新建一个CustomerInvocationHandler类实现InvocationHandler接口
在这里插入图片描述
CustomerInvocationHandler:

package com.yf.cn.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class CustomerInvocationHandler implements InvocationHandler {
    private Object target;
    public CustomerInvocationHandler(Object object){
        this.target = object;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //添加增强的逻辑
        System.out.println("TestDao增强的逻辑");
        return method.invoke(target,args);
    }
}

1.4测试:
package com.yf.cn.test;




import com.yf.cn.dao.TestDao;
import com.yf.cn.dao.TestDaoImpl;
import com.yf.cn.util.CustomerInvocationHandler;

import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) throws Exception {
        TestDao jdkProxy = (TestDao) Proxy.newProxyInstance(Test.class.getClassLoader(),
                new Class[]{TestDao.class},new CustomerInvocationHandler(new TestDaoImpl()));
        jdkProxy.test1();
        jdkProxy.test2();

    }
}

执行如上测试方法,查看控制台输出日志发现已经实现的目标方法的动态代理
在这里插入图片描述
3. 模拟JDK动态代理(手写代码)

java代理之静态代理实践(一)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值