wittyResry / myIssue

My issue mark down^_^ 欢迎吐槽,讨论~~
https://github.com/wittyResry/myIssue/issues
The Unlicense
5 stars 1 forks source link

Bean拷贝之Cglib BeanCopier #82

Open wittyResry opened 6 years ago

wittyResry commented 6 years ago

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);
                    }
                }