Java 动态代理使用

目录结构

在这里插入图片描述

public interface UserDao {
    public int add(int a,int b);
    public String update(String id);
}
public class UserDaoImpl implements UserDao{
    @Override
    public int add(int a, int b) {
        System.out.println("UserDaoImpl add方法执行了。。。。");
        return a+b;
    }

    @Override
    public String update(String id) {
        System.out.println("UserDaoImpl update方法执行了.....");
        return id;
    }
}

public class JDKProxy {
    public static void main(String[] args){
        //创建接口实现类代理对象
        Class<?>[] interfaces = {UserDao.class};
        UserDao userDao = new UserDaoImpl();

        //classLoader,类加载器
        //interfaces,被代理的对象
        //InvocationHandler,代理对象:去执行代理的方法
        UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));
        String ni = dao.update("ni");
        System.out.println("id为:" + ni);

        int add = dao.add(1, 2);
        System.out.println("结果为:" + add);
    }
}

/**
 * 创建代理对象代码
 */
class UserDaoProxy implements InvocationHandler {
    /**
     * 把创建的是谁的代理对象,把谁传递过来
     * 有参构造传递
     */
    private final Object obj;

    public UserDaoProxy(Object obj) {
        this.obj = obj;
    }

    /**
     * 增强的逻辑
     * @param proxy 代理对象自身
     * @param method 正在执行的方法
     * @param args 传递的参数
     * @return res
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前
        System.out.println("方法之前执行...." + method.getName() + ":传递的参数..." + Arrays.toString(args));

        //被增强的方法执行
        Object res = method.invoke(obj, args);

        //方法之后
        System.out.println("方法之后执行..." + obj);
        return res;
    }
}

工厂方式创建代理类适配器

public class JDKProxyFactory {

    public static <T> T getProxy(Class<T> cacheClazz, Class<? extends ICacheAdapter> cacheAdapter) throws Exception {
        InvocationHandler handler = new JDKInvocationHandler(cacheAdapter.newInstance());
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        return (T)Proxy.newProxyInstance(classLoader, new Class[]{cacheClazz}, handler);
    }

}
public class JDKInvocationHandler implements InvocationHandler {

    /**
     * 把创建的是谁的代理对象,把谁传递过来
     * 有参构造传递
     */
    private final ICacheAdapter cacheAdapter;

    public JDKInvocationHandler(ICacheAdapter cacheAdapter) {
        this.cacheAdapter = cacheAdapter;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       // 获取和CacheService 同名的 方法 
        Method method1 = ICacheAdapter.class.getMethod(method.getName(), ClassLoaderUtils.getClazzByArgs(args));
        Object res = method1.invoke(cacheAdapter, args);
        System.out.println("方法执行后!....");
        return res;
    }

}

创建的是CacheService 的代理类,代理的方法是 CacheAdapter接口下的方法

    @Test
    public void test_CacheService() throws Exception {
        CacheService proxy_EGM = JDKProxyFactory.getProxy(CacheService.class, EGMCacheAdapter.class);
        proxy_EGM.set("user_name_01", "小傅哥");
        String val01 = proxy_EGM.get("user_name_01");
        logger.info("缓存服务 EGM 测试,proxy_EGM.get 测试结果:{}", val01);

        CacheService proxy_IIR = JDKProxyFactory.getProxy(CacheService.class, IIRCacheAdapter.class);
        proxy_IIR.set("user_name_01", "小傅哥");
        String val02 = proxy_IIR.get("user_name_01");
        logger.info("缓存服务 IIR 测试,proxy_IIR.get 测试结果:{}", val02);
    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值