使用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);
}
分享到:
相关推荐
深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器
类加载器分为根加载器(bootstrap classloader)、扩展类加载器(ext classloader)、系统类加载器(system classloader)、自定义类加载器(通常继承java.net.URLClassLoader,重写findClass()),它们的关系通常...
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
02 类加载子系统 PPT 介绍 JVM 的类加载子系统, 包括类加载阶段和流程、加载器分类和类加载机制等。
关于类加载器的 上课ppt -java虚拟机自带的加载器 根类加载器(Bootstrap) c++写的看不到扩展类加载器(extension) 系统类加载器(System) AppClassLoad 用户自定义的类加载器 Java.lang.ClassLoader的子类
java类加载原理分析,引导类加载器,扩展类加载器,系统类加载器(也叫应用类加载器)
总结了类加载器子系统相关的内容,主要包括类加载器子系统的作用、ClassLoader角色、加载的过程、双亲委派机制以及沙箱安全机制等内容
如果户创建的JAR放在此录下,也会动由扩展类加载器加载.应程序类加载器(系统类加载器,Application ClassLoader)java语编写,由sun.
加载JVM 有哪些类加载器:引导类加载器扩展类加载器系统类加载器自定义类加载器不同加载器可以加载哪些类:加载器的等级:引导类加载器 > 扩展类加载器 > 系统类
类加载器负责加载所有类,系统为所有被载入内存中的类生成一个java.lang.Class实例。一旦一个类被载入JVM中,同一个类不会再被再次载入。 思考问题:怎么样才算同一个类? 当JVM启动时,会形
1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar、zip等等压缩文件加载类,自动解析jar文件找到class文件...而由用户自定义的类加载器所加载的类会被卸载掉!
这里将JVM、OSGI、Tomcat以及OSGI和Web服务器整合平台的类加载器做了详细的说明和分析,能让你对类加载器的做一个较为系统的了解。
深入理解和探究Java类加载机制—- 1.java.lang.ClassLoader类介绍 ... Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由 Java 应用开发人员编写的。 引导类加载器(bootstrap class loade
java中的类加载器:java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap, ExtClassLoader,AppClassLoader类加载器也是一个java类,因此类加载器也需要被加载,所以...
所有Java应用都至少引用java.lang.Object类,也就是在运行的时候,java.lang.Object这个类需要被加载到Java虚拟机中,如果这个加载过程由Java自己的类加载器来完成,则在虚拟机中会存在多个版本的java.lang.Object类...
此外,我们还会探讨Java程序的类加载器和双亲委派机制,以及自定义类加载器和类卸载的实现原理和应用方法。 总的来说,本资源将为Java程序员提供全面的Java字节码和类加载原理和实践经验。通过学习本资源,开发人员将...
应用程序进行动态无类加载器修改。 具体来说,Pinoc 支持Java 方法入口处的代码注入,整个Java 方法的代码替换,以及新Java 方法的添加。 特征 提供一种无需 Java 类加载器即可进行修补程序部署的新技术。 提供了一...
1.类加载器 类加载器一般只有3种(除开自己定义的)分别为: 1.Bootstrap ClassLoader:根加载器 2.Extension ClassLoader:扩展加载器 3.System ClassLoader:系统加载器 以下我们将对这3种加载器进行分析: 1.Bootstrap ...
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class... 一个类如果要被JVM所调度执行,必须先把这个类加载到JVM内存里,java.lang下有个很重要的类ClassL
基本知识 Java的类加载设计了一套双亲代理的模式,使得用户没法...通过底层代码来实现的,基本上只要parent为null,那就表示引导类加载器。 比如:charsets.jar、deploy.jar、javaws.jar、jce.jar、jfr.jar、jfxswt.