设为首页 加入收藏

TOP

动态代理原理(一)
2023-07-25 21:41:15 】 浏览:74
Tags:

简介

java.lang.reflect.Proxy是整个jdk中实现动态代理的核心 类,本文主要介绍Proxy类的实现,关于Proxy类的使用请自行查阅其他资料。

Field

  • constructorParams:构造函数的参数,用于代理类的核心的逻辑实现,关于InvocationHandler这个接口的介绍不是本文的重点,此处不做介绍。

private static final Class<?>[] constructorParams =
  { InvocationHandler.class };
  • proxyClassCache: 代理类的缓存,此类是一个二级缓存的实现,利用WeakReference的特性,当内存占用过高的时候会JVM自动进行回收缓存中的数据。

private static final WeakCache<ClassLoader, Class<?>[], Class<?>>
   proxyClassCache = new WeakCache<>(new KeyFactory(), new ProxyClassFactory());
  • h: InvocationHandler接口,用于此代理实例的调用处理程序。

Inner Class

  • KeyFactory:顾名思义,缓存代理的key的工厂实现,此类仅一个方法,实现了BiFunction接口,具体代码如下

private static final class KeyFactory
   implements BiFunction<ClassLoader, Class<?>[], Object>
{
   @Override
   public Object apply(ClassLoader classLoader, Class<?>[] interfaces) {
       switch (interfaces.length) {
           case 1: return new Key1(interfaces[0]); // the most frequent
           case 2: return new Key2(interfaces[0], interfaces[1]);
           case 0: return key0;
           default: return new KeyX(interfaces);
      }
  }
}

由以上代码可见,该类的实现分为委托给了Key0,Key1,Key2,KeyX这四个类实现,其中key0是一个Object,其他的类Key1,Key2,KeyX则是分别用不同的实现对hashcode和equals方法进行了不同的实现,大同小异。这里则分别简单的做一下解释。

private static final class Key1 extends WeakReference<Class<?>> {
   private final int hash;
?
   Key1(Class<?> intf) {
       super(intf);
       this.hash = intf.hashCode();
  }
?
   @Override
   public int hashCode() {
       return hash;
  }
?
   @Override
   public boolean equals(Object obj) {
       Class<?> intf;
       return this == obj ||
              obj != null &&
              obj.getClass() == Key1.class &&
              (intf = get()) != null &&
              intf == ((Key1) obj).get();
  }
}
private static final class Key2 extends WeakReference<Class<?>> {
   private final int hash;
   private final WeakReference<Class<?>> ref2;
?
   Key2(Class<?> intf1, Class<?> intf2) {
       super(intf1);
       hash = 31 * intf1.hashCode() + intf2.hashCode();
       ref2 = new WeakReference<Class<?>>(intf2);
  }
?
   @Override
   public int hashCode() {
       return hash;
  }
?
   @Override
   public boolean equals(Object obj) {
       Class<?> intf1, intf2;
       return this == obj ||
              obj != null &&
              obj.getClass() == Key2.class &&
              (intf1 = get()) != null &&
      &n
首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇读Java性能权威指南(第2版)笔记.. 下一篇Gateway集成Netty服务

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目