系统类加载器动态加载

使用ASM动态编码时,只能获得动态的字节码,但是如果想要让JVM知道,必须要使用加载器来完成.而通常会自定义ClassLoader进行加载.那么如果是系统类加载器加载的类,无法引用自定义加载器加载的类.

那么如果想要ASM生成的字节码,然后通过系统类加载进行加载,那么就没有上面的问题了.

而JVM基于安全考虑,是不允许在未经许可而是用系统类加载器的.在开源项目javassist和ASM中都是通过以下办法来实现用系统类加载器加载动态字节码.

private static Method DEFINE_CLASS;
private static final ProtectionDomain PROTECTION_DOMAIN;

static {
PROTECTION_DOMAIN = (ProtectionDomain)AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
return ReflectUtils.class.getProtectionDomain();
}
});

AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
try {
Class loader = Class.forName("java.lang.ClassLoader"); // JVM crash w/o this
DEFINE_CLASS = loader.getDeclaredMethod("defineClass",
new Class[]{ String.class,
byte[].class,
Integer.TYPE,
Integer.TYPE,
ProtectionDomain.class });
DEFINE_CLASS.setAccessible(true);
} catch (ClassNotFoundException e) {
throw new CodeGenerationException(e);
} catch (NoSuchMethodException e) {
throw new CodeGenerationException(e);
}
return null;
}
});
}

public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception {
Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN };
return (Class)DEFINE_CLASS.invoke(loader, args);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值