@CallerSensitive
public static Object newProxyInstance(ClassLoader loader,
Class>[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
{
Objects.requireNonNull(h);
//复制接口信息
final Class>[] intfs = interfaces.clone();
//权限校验
final SecurityManager sm = System.getSecurityManager();
if (sm != null) {
checkProxyAccess(Reflection.getCallerClass(), loader, intfs);
}
//创建代理类的Class对象,即创建字节码信息并加载到虚拟机中
Class> cl = getProxyClass0(loader, intfs);
try {
if (sm != null) {
checkNewProxyPermission(Reflection.getCallerClass(), cl);
}
//获取构造器方法
final Constructor> cons = cl.getConstructor(constructorParams);
final InvocationHandler ih = h;
//如果构造器方法的访问权限不是public,反射设置其为可访问状态
if (!Modifier.isPublic(cl.getModifiers())) {
AccessController.doPrivileged(new PrivilegedAction() {
public Void run() {
cons.setAccessible(true);
return null;
}
});
}
//反射调用构造器方法创建代理实例
return cons.newInstance(new Object[]{h});
} catch (IllegalAccessException|InstantiationException e) {
throw new InternalError(e.toString(), e);
} catch (InvocationTargetException e) {
Throwable t = e.getCause();
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
} else {
throw new InternalError(t.toString(), t);
}
} catch (NoSuchMethodException e) {
throw new InternalError(e.toString(), e);
}
}
从上述源码可以发现代理类的创建逻辑处于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创建代理类缓存后并返回
//其中proxyClassCache被默认初始化为:new WeakCache<>(new KeyFactory(), new ProxyClassFactory())
return proxyClassCache.get(loader, interfaces);
}
proxyClassCache.get(loader, interfaces)方法逻辑如下
public V get(K key, P parameter) {
Objects.requireNonNull(parameter);
//清理缓存,使用Map缓存,其key使用WeakReference,因此key可能会被垃圾回收器回收,当key被回收后(放入referenceQueque中)通过该key回收其value
expungeStaleEntries();
//构建可被自动回收的cacheKey(主要方式代理类过多占用内存),这里传入的key是ClassLoader,因此cacheKey作为一级缓存以类加载器作为区分
Object cacheKey = CacheKey.valueOf(key, refQueue);
// lazily install the 2nd level valuesMap for the particular cacheKey
//先判断缓存map是否存在,如果不存在则初始化缓存value map
ConcurrentMap
private void expungeStaleEntries()主要用于清理陈旧的缓存信息
private void expungeStaleEntries() {
CacheKey cacheKey;
//通过循环遍历refQueue来清理map和reverseMap,refQueue是由虚拟机进行维护的,详情参见java Reference
while ((cacheKey = (CacheKey)refQueue.poll()) != null) {
cacheKey.expungeFrom(map, reverseMap);
}
}
void cacheKey.expungeFrom(ConcurrentMap, ? extends ConcurrentMap, ?>> map,
ConcurrentMap, Boolean> reverseMap) {
// removing just by key is always safe here because after a CacheKey
// is cleared and enqueue-ed it is only equal to itself
// (see equals method)...
//当cacheKey被虚拟机自动回收后,则再调用该方法时将清理掉对应的value
ConcurrentMap, ?> valuesMap = map.remove(this);
// remove also from reverseMap if needed
if (valuesMap != null) {
for (Object cachevalue : valuesMap.values()) {
reverseMap.remove(cachevalue);
}
}
}
@Override
public Object apply(ClassLoader classLoader, Class>[] interfaces) {
//简单判断接口数量根据接口数量构建Key,注意Key1,Key2,Keyx用于保存接口的类都是弱引用类
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);
}
}
最终通过Factory类(函数式接口实现)来获取Class类信息,源码如下:
@Override
public synchronized V get() { // serialize access
// re-check
//重复检测判断缓存map中缓存的Supplier和当前Supplier是否是同一对象
Supplier supplier = valuesMap.get(subKey);
if (supplier != this) {
// something changed while we were waiting:
// might be that we were replaced by a Cachevalue
// or were removed because of failure ->
// return null to signal WeakCache.get() to retry
// the loop
//多线程或者由于JVM不定时回收可能会导致该种情况,此时将返回null进入上层循环重新获取Supplier后再执行该方法
return null;
}
// else still us (supplier == this)
// create new value
V value = null;
try {
//valueFactory即ProxyClassFactory,通过该BiFunction函数接口获取Class代理对象
value = Objects.requireNonNull(valueFactory.apply(key, parameter));
} finally {
if (value == null) { // remove us on failure
valuesMap.remove(subKey, this);
}
}
// the only path to reach here is with non-null value
assert value != null;
// wrap value with Cachevalue (WeakReference)
//将创建好的Class代理对象封装成Cachevalue对象
Cachevalue cachevalue = new Cachevalue<>(value);
// put into reverseMap
//reverseMap主要用于判断一个类是否是jdk的动态代理以及统计jdk动态代理类数量
reverseMap.put(cachevalue, Boolean.TRUE);
// try replacing us with Cachevalue (this should always succeed)
//将Cachevalue对象替换Factory对象,之后再代理时就不用再次构建字节码信息并装载了
if (!valuesMap.replace(subKey, this, cachevalue)) {
throw new AssertionError("Should not reach here");
}
// successfully replaced us with new Cachevalue -> return the value
// wrapped by it
return value;
}
最终创建Class对象的逻辑处于ProxyClassFactory中,具体如下:
public Class> apply(ClassLoader loader, Class>[] interfaces) {
Map, Boolean> interfaceSet = new IdentityHashMap<>(interfaces.length);
//for循环遍历代理接口做检测,接口匹配对应类加载器、是同一接口
for (Class> intf : interfaces) {
Class> interfaceClass = null;
try {
interfaceClass = Class.forName(intf.getName(), false, loader);
} catch (ClassNotFoundException e) {
}
if (interfaceClass != intf) {
throw new IllegalArgumentException(
intf + " is not visible from class loader");
}
if (!interfaceClass.isInterface()) {
throw new IllegalArgumentException(
interfaceClass.getName() + " is not an interface");
}
if (interfaceSet.put(interfaceClass, Boolean.TRUE) != null) {
throw new IllegalArgumentException(
"repeated interface: " + interfaceClass.getName());
}
}
String proxyPkg = null; // package to define proxy class in
int accessFlags = Modifier.PUBLIC | Modifier.FINAL;
for (Class> intf : interfaces) {
int flags = intf.getModifiers();
//如果存在非public接口,则检测代理接口是否位于同一包下,不处于同一包下将抛出异常
if (!Modifier.isPublic(flags)) {
accessFlags = Modifier.FINAL;
String name = intf.getName();
int n = name.lastIndexOf('.');
String pkg = ((n == -1) ? "" : name.substring(0, n + 1));
if (proxyPkg == null) {
proxyPkg = pkg;
} else if (!pkg.equals(proxyPkg)) {
throw new IllegalArgumentException(
"non-public interfaces from different packages");
}
}
}
//默认包使用com.sun.proxy.
if (proxyPkg == null) {
// if no non-public proxy interfaces, use com.sun.proxy package
proxyPkg = ReflectUtil.PROXY_PACKAGE + ".";
}
//创建代理名,使用$Proxy0,$Proxy1依次类推
long num = nextUniqueNumber.getAndIncrement();
String proxyName = proxyPkg + proxyClassNamePrefix + num;
//使用sun提供的字节码操纵框架构建class的字节码信息
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
proxyName, interfaces, accessFlags);
try {
//使用类加载器装载字节码生成Class对象并返回
return defineClass0(loader, proxyName,
proxyClassFile, 0, proxyClassFile.length);
} catch (ClassFormatError e) {
throw new IllegalArgumentException(e.toString());
}
}