Open wittyResry opened 6 years ago
https://github.com/cglib/cglib
为什么要使用弱引用?source.cache使用了 WeakHashMap WeakHashMap的key值为弱引用(WeakReference)。如果一个WeakHashMap的key被回收,那么它对应用的value也将被自动的被移除。这也是为什么要使用classloader作为key,当classloader被回收,使用这个classloader加载的类也应该被回收,在这时将这个键值对移除是合理的。
private static final BeanCopier bc = BeanCopier.create(FromBean.class, ToBean.class, false); ToBean toBean = new ToBean(); bc.copy(frombean, toBean, null); <dependency> <groupId>asm</groupId> <artifactId>asm</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>asm</groupId> <artifactId>asm-commons</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>asm</groupId> <artifactId>asm-util</artifactId> <version>3.3.1</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib-nodep</artifactId> <version>2.2.2</version> </dependency>
Ref: http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html
ClassLoader loader = getClassLoader(); Map cache2 = null; cache2 = (Map)source.cache.get(loader); //尝试从缓存获取 if (cache2 == null) { cache2 = new HashMap(); cache2.put(NAME_KEY, new HashSet());//对象到Reference的映射 source.cache.put(loader, cache2); } else if (useCache) { Reference ref = (Reference)cache2.get(key);//拿到对象的引用 gen = (Class) (( ref == null ) ? null : ref.get()); // ref.get()拿到Class } if (gen == null) { Object save = CURRENT.get(); CURRENT.set(this); try { if (gen == null) { byte[] b = strategy.generate(this);//获取对象的字节码,调用子类的generateClass函数 String className = ClassNameReader.getClassName(new ClassReader(b)); getClassNameCache(loader).add(className);//添加到缓存Set中中,在第二层Map中,出现了唯一一个不和谐的key值:NAME_KEY。它对应的Set存储了当前缓存的所有生成类的类名,用于检测生成类的类名是否重复。 gen = ReflectUtils.defineClass(className, b, loader);//根据字节码生成类,返回Class } if (useCache) { cache2.put(key, new WeakReference(gen));//在缓存中放入新生成的Class的引用,注意这里使用了WeakReference,为了在垃圾回收 } return firstInstance(gen);//根据Class创建实例,实际是使用ReflectUtils.newInstance(type);生成实例(java.lang.reflect.Constructor#newInstance) } finally { CURRENT.set(save); } }
https://github.com/cglib/cglib
为什么要使用弱引用?source.cache使用了 WeakHashMap WeakHashMap的key值为弱引用(WeakReference)。如果一个WeakHashMap的key被回收,那么它对应用的value也将被自动的被移除。这也是为什么要使用classloader作为key,当classloader被回收,使用这个classloader加载的类也应该被回收,在这时将这个键值对移除是合理的。
Ref: http://www.cnblogs.com/kaka/archive/2013/03/06/2945514.html