publicstaticObjectnewProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throwsIllegalArgumentException{//检测代理类不为空Objects.requireNonNull(h);//拷贝代理类finalClass<?>[] intfs = interfaces.clone();//安全管理finalSecurityManager sm =System.getSecurityManager();if(sm !=null){checkProxyAccess(Reflection.getCallerClass(), loader, intfs);}/*
* Look up or generate the designated proxy class.
*///生成class代理类。关键Class<?> cl =getProxyClass0(loader, intfs);
2.跟 getProxyClass0()方法
private static Class<?> getProxyClass0(ClassLoader loader,
Class<?>... interfaces) {
if (interfaces.length > 65535) {
throw new IllegalArgumentException("interface limit exceeded");
}
// If the proxy class defined by the given loader implementing
// the given interfaces exists, this will simply return the cached copy;
// otherwise, it will create the proxy class via the ProxyClassFactory
//上面译文 如果之前加载过会从缓存获取直接返回,否则使用ProxyClassFactory生成
return proxyClassCache.get(loader, interfaces);
}
3. 继续跟ProxyClassFactory类
private static final class ProxyClassFactory
implements BiFunction<ClassLoader, Class<?>[], Class<?>>
{
// prefix for all proxy class names
//生成类名
private static final String proxyClassNamePrefix = "$Proxy";
// next number to use for generation of unique proxy class names
//生成数字下标 类名+下标
private static final AtomicLong nextUniqueNumber = new AtomicLong();
@Override
public Class<?> apply(ClassLoader loader, Class<?>[] interfaces) {
/**省略.....
中间做了一些校验,校验是否接口、接口是否重复
**/
//生成代理类class文件
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
proxyName, interfaces, accessFlags);
}
4. generateProxyClass()具体如何生成 (关键)
public static byte[] generateProxyClass(final String var0, Class<?>[] var1, int var2) {
ProxyGenerator var3 = new ProxyGenerator(var0, var1, var2);
//开始具体生成class
final byte[] var4 = var3.generateClassFile();
public V get(K key, P parameter) {
Objects.requireNonNull(parameter);
expungeStaleEntries();
Object cacheKey = CacheKey.valueOf(key, refQueue);
// lazily install the 2nd level valuesMap for the particular cacheKey
ConcurrentMap<Object, Supplier<V>> valuesMap = map.get(cacheKey);
if (valuesMap == null) {
ConcurrentMap<Object, Supplier<V>> oldValuesMap
= map.putIfAbsent(cacheKey,
valuesMap = new ConcurrentHashMap<>());
if (oldValuesMap != null) {
valuesMap = oldValuesMap;
}
}
// create subKey and retrieve the possible Supplier<V> stored by that
// subKey from valuesMap
//以上缓存未命中,就使用ProxyClassFactory.apply生成,这样就过度到第3步了
Object subKey = Objects.requireNonNull(subKeyFactory.apply(key, parameter));