- 浏览: 2692533 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
一、Java ClassLoader
1,什么是ClassLoader
与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。
此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。
而且,Java ClassLoader 就是用 Java 语言编写的。这意味着创建您自己的 ClassLoader 非常容易,不必了解 JVM 的微小细节。
2,一些重要的方法
A)loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。该方法的定义为:Class loadClass( String name, boolean resolve );
name:JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve:参数告诉方法是否需要解析类。
B)defineClass
defineClass方法是ClassLoader的主要诀窍。该方法接受由原始字节组成的数组并把它转换成Class对象。
C)findSystemClass
findSystemClass方法从本地文件系统中寻找类文件,如果存在,就使用defineClass将原始字节转换成Class对象,以将该文件转换成类。
D)resolveClass
可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时可以调用resolveClass,这取决于loadClass的resolve参数的值。
E)findLoadedClass
findLoadedClass充当一个缓存:当请求loadClass装入类时,它调用该方法来查看ClassLoader是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。
3,Java2中ClassLoader的变动
1)loadClass的缺省实现
在Java2中loadClass的实现嵌入了大多数查找类的一般方法,并使您通过覆盖findClass方法来定制它,在适当的时候findClass会调用loadClass。
这种方式的好处是可能不一定要覆盖loadClass,只要覆盖findClass就行了,这减少了工作量。
2)新方法:findClass
loadClass的缺省实现调用这个新方法。
3)新方法:getSystemClassLoader
如果覆盖findClass或loadClass,getSystemClassLoader让我们以实际ClassLoader对象来访问系统ClassLoader,而不是固定的从findSystemClass 调用它。
4)新方法:getParent
为了将类请求委托给父ClassLoader,这个新方法允许ClassLoader获取它的父ClassLoader。
4,定制ClassLoader
其实我们或多或少都使用过定制的ClassLoader,因为Applet查看器中就包含一个定制的ClassLoader。
它不在本地文件系统中寻找类,而是访问远程服务器上的 Web 站点,经过 HTTP 装入原始的字节码文件,并把它们转换成JVM 内的类。
Applet查看器中的ClassLoader还可以做其它事情:它们支持安全性以及使不同的Applet在不同的页面上运行而互不干扰。
我们将写一个自己的ClassLoader实现示例,它将实现如下步骤,这也是ClassLoader的工作原理:
# 调用 findLoadedClass 来查看是否存在已装入的类。
# 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
# 如果已有原始字节,调用defineClass将它们转换成Class对象。
# 如果没有原始字节,然后调用findSystemClass查看是否从本地文件系统获取类。
# 如果resolve参数是true,那么调用resolveClass解析Class对象。
# 如果还没有类,返回ClassNotFoundException。
# 否则,将类返回给调用程序。
话不多说,看看代码先:
FileClassLoader.java:
MyApp.java:
编译并运行MyApp类,结果为:
楼主的回答是不准确的,这和resolve八杆子打不上边。class有没加载,看的是defindClass()。
再看loadClass为什么能够正确,其实也不是必然的,仅仅表明MyApp并不是由FileClassLoader加载的,可见它的内部实现把加载的工作委托给了父ClassLoader。
好,就算FileClassLoader自己加载了MyApp,转型的时候也可能ClassCastException,因为每一个ClassLoader在虚拟机内部都有自己的命名空间,除非调用者的类也是FileClassLoader加载的,否则转型的时候会使用调用者的ClassLoader加载MyApp,此MyApp非FileClassLoader加载的MyApp,转型也会报错。
其实,这里有很多种情况,由于时间原因我的解释可能比较乱,没有说很明白,我觉得能够把一些关键的基本问题:defindClass,父子委托,命名空间 & method space,Class.forName和Thread.currentThread.getContextClassLoader(),resolveClass()解释明白,应该能够解释大多数人在部署,调试中遇到的大部分问题。
请问用Object obj = objClass.newInstance();得到的对象是不是只包括该MyApp的基本信息,它是不是不能向下转型到MyApp呢?
我在列子中直接用loader.findClass("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时报类型转化异常.
而我在列子中直接用loader.loadClass ("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时可以正确转化.
我的理解是用loader.findClass("MyApp")得到的Class对象并没有真正加载,但可以用它得到类的一些信息,但是用loader.loadClass ("MyApp")得到的Class对象是真正加载到JVM中的.
不知道我的理解对不对?
1,什么是ClassLoader
与 C 或 C++ 编写的程序不同,Java 程序并不是一个可执行文件,而是由许多独立的类文件组成,每一个文件对应于一个 Java 类。
此外,这些类文件并非立即全部都装入内存,而是根据程序需要装入内存。ClassLoader 是 JVM 中将类装入内存的那部分。
而且,Java ClassLoader 就是用 Java 语言编写的。这意味着创建您自己的 ClassLoader 非常容易,不必了解 JVM 的微小细节。
2,一些重要的方法
A)loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。该方法的定义为:Class loadClass( String name, boolean resolve );
name:JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve:参数告诉方法是否需要解析类。
B)defineClass
defineClass方法是ClassLoader的主要诀窍。该方法接受由原始字节组成的数组并把它转换成Class对象。
C)findSystemClass
findSystemClass方法从本地文件系统中寻找类文件,如果存在,就使用defineClass将原始字节转换成Class对象,以将该文件转换成类。
D)resolveClass
可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时可以调用resolveClass,这取决于loadClass的resolve参数的值。
E)findLoadedClass
findLoadedClass充当一个缓存:当请求loadClass装入类时,它调用该方法来查看ClassLoader是否已装入这个类,这样可以避免重新装入已存在类所造成的麻烦。
3,Java2中ClassLoader的变动
1)loadClass的缺省实现
在Java2中loadClass的实现嵌入了大多数查找类的一般方法,并使您通过覆盖findClass方法来定制它,在适当的时候findClass会调用loadClass。
这种方式的好处是可能不一定要覆盖loadClass,只要覆盖findClass就行了,这减少了工作量。
2)新方法:findClass
loadClass的缺省实现调用这个新方法。
3)新方法:getSystemClassLoader
如果覆盖findClass或loadClass,getSystemClassLoader让我们以实际ClassLoader对象来访问系统ClassLoader,而不是固定的从findSystemClass 调用它。
4)新方法:getParent
为了将类请求委托给父ClassLoader,这个新方法允许ClassLoader获取它的父ClassLoader。
4,定制ClassLoader
其实我们或多或少都使用过定制的ClassLoader,因为Applet查看器中就包含一个定制的ClassLoader。
它不在本地文件系统中寻找类,而是访问远程服务器上的 Web 站点,经过 HTTP 装入原始的字节码文件,并把它们转换成JVM 内的类。
Applet查看器中的ClassLoader还可以做其它事情:它们支持安全性以及使不同的Applet在不同的页面上运行而互不干扰。
我们将写一个自己的ClassLoader实现示例,它将实现如下步骤,这也是ClassLoader的工作原理:
# 调用 findLoadedClass 来查看是否存在已装入的类。
# 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
# 如果已有原始字节,调用defineClass将它们转换成Class对象。
# 如果没有原始字节,然后调用findSystemClass查看是否从本地文件系统获取类。
# 如果resolve参数是true,那么调用resolveClass解析Class对象。
# 如果还没有类,返回ClassNotFoundException。
# 否则,将类返回给调用程序。
话不多说,看看代码先:
FileClassLoader.java:
import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class FileClassLoader extends ClassLoader { public Class findClass(String name) { byte[] data = loadClassData(name); return defineClass(name, data, 0, data.length); } private byte[] loadClassData(String name) { FileInputStream fis = null; byte[] data = null; try { fis = new FileInputStream(new File("D:\\project\\test\\" + name + ".class")); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int ch = 0; while ((ch = fis.read()) != -1) { baos.write(ch); } data = baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } return data; } }
MyApp.java:
public class MyApp { public static void main(String[] args) throws Exception { FileClassLoader loader = new FileClassLoader(); Class objClass = loader.findClass("MyApp"); Object obj = objClass.newInstance(); System.out.println(objClass.getName()); System.out.println(objClass.getClassLoader()); System.out.println(obj); } }
编译并运行MyApp类,结果为:
MyApp FileClassLoader@757aef MyApp@9cab16
评论
21 楼
ytzhsh
2008-07-04
当我对字节码编译不知所措的时候,发现了这个帖子
谢谢楼主,目前正在学习ASM CGLIB
谢谢楼主,目前正在学习ASM CGLIB
20 楼
javaeyename
2008-06-14
@hideto 以后有长篇的话,能不能放在一个帖子里面,不要搞到评论里面,看着难受,估计你写的也难受吧!呵呵!你这几个东西到ibm的开发论坛上有比较详细的介绍!你介绍的不全!
19 楼
天门冬
2008-04-01
支持,哈哈
18 楼
luopan68
2008-03-31
不是解析resolve的事情
loader.findClass("MyApp")是该loader载入的MyApp
该loader载入的MyApp在你的代码中强转是强转成system class loader加载的那个MyApp,classloader不同
loader.loadClass ("MyApp")使用双亲委托模式,先由他的parent找,
你的MyApp是由该loader的parent找到了返回的。loader相同,你强转是可以的
loader.findClass("MyApp")是该loader载入的MyApp
该loader载入的MyApp在你的代码中强转是强转成system class loader加载的那个MyApp,classloader不同
loader.loadClass ("MyApp")使用双亲委托模式,先由他的parent找,
你的MyApp是由该loader的parent找到了返回的。loader相同,你强转是可以的
17 楼
yujiang
2007-12-17
理解ClassLoader还是有点难度的,
一个比较不错的练习就是去看看OSGI(core)
规范中[Module Layer]这一部分.
一个比较不错的练习就是去看看OSGI(core)
规范中[Module Layer]这一部分.
16 楼
leadyu
2007-12-16
引用
代码
FileClassLoader loader = new FileClassLoader();
Class objClass = loader.findClass("MyApp");
Object obj = objClass.newInstance();
请问用Object obj = objClass.newInstance();得到的对象是不是只包括该MyApp的基本信息,它是不是不能向下转型到MyApp呢?
我在列子中直接用loader.findClass("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时报类型转化异常.
而我在列子中直接用loader.loadClass ("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时可以正确转化.
我的理解是用loader.findClass("MyApp")得到的Class对象并没有真正加载,但可以用它得到类的一些信息,但是用loader.loadClass ("MyApp")得到的Class对象是真正加载到JVM中的.
不知道我的理解对不对?
FileClassLoader loader = new FileClassLoader();
Class objClass = loader.findClass("MyApp");
Object obj = objClass.newInstance();
请问用Object obj = objClass.newInstance();得到的对象是不是只包括该MyApp的基本信息,它是不是不能向下转型到MyApp呢?
我在列子中直接用loader.findClass("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时报类型转化异常.
而我在列子中直接用loader.loadClass ("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时可以正确转化.
我的理解是用loader.findClass("MyApp")得到的Class对象并没有真正加载,但可以用它得到类的一些信息,但是用loader.loadClass ("MyApp")得到的Class对象是真正加载到JVM中的.
不知道我的理解对不对?
楼主的回答是不准确的,这和resolve八杆子打不上边。class有没加载,看的是defindClass()。
再看loadClass为什么能够正确,其实也不是必然的,仅仅表明MyApp并不是由FileClassLoader加载的,可见它的内部实现把加载的工作委托给了父ClassLoader。
好,就算FileClassLoader自己加载了MyApp,转型的时候也可能ClassCastException,因为每一个ClassLoader在虚拟机内部都有自己的命名空间,除非调用者的类也是FileClassLoader加载的,否则转型的时候会使用调用者的ClassLoader加载MyApp,此MyApp非FileClassLoader加载的MyApp,转型也会报错。
其实,这里有很多种情况,由于时间原因我的解释可能比较乱,没有说很明白,我觉得能够把一些关键的基本问题:defindClass,父子委托,命名空间 & method space,Class.forName和Thread.currentThread.getContextClassLoader(),resolveClass()解释明白,应该能够解释大多数人在部署,调试中遇到的大部分问题。
15 楼
lkl_1981
2007-12-14
谢谢搂主,太博学了
14 楼
javalu
2007-07-11
学习中。。。。
13 楼
dennis_zane
2007-07-08
这帖子不应该评精华,只是简单的资料罗列,而且有错的地方,比如
A)loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。该方法的定义为:Class loadClass( String name, boolean resolve );
name:JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve:参数告诉方法是否需要解析类。
这个说法完全是错的,resolve是告诉是否要链接类,而不是解析类。就算resolve是false,返回的也可能是链接过的类,因为在第一次链接后,以后都是直接返回已经链接的类。同样,resolveClass方法是链接类,而不是解析类,解析是可选的,根据JDK实现不同而不同,这一点看JDK文档都应该知道,这么明显的错误怎么评精华呢?关于ClassLoader网上充斥了太多似是而非的资料,还是自己看vmspec或者《深入java虚拟机》为好。
A)loadClass
ClassLoader.loadClass() 是ClassLoader的入口点。该方法的定义为:Class loadClass( String name, boolean resolve );
name:JVM 需要的类的名称,如 Foo 或 java.lang.Object。
resolve:参数告诉方法是否需要解析类。
这个说法完全是错的,resolve是告诉是否要链接类,而不是解析类。就算resolve是false,返回的也可能是链接过的类,因为在第一次链接后,以后都是直接返回已经链接的类。同样,resolveClass方法是链接类,而不是解析类,解析是可选的,根据JDK实现不同而不同,这一点看JDK文档都应该知道,这么明显的错误怎么评精华呢?关于ClassLoader网上充斥了太多似是而非的资料,还是自己看vmspec或者《深入java虚拟机》为好。
12 楼
hover1215
2007-07-07
# 调用 findLoadedClass 来查看是否存在已装入的类。
# 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
请问:神奇的方式获取原始字节,到底是怎么回事?能解释一下吗?
# 如果没有,那么采用那种特殊的神奇方式来获取原始字节。
请问:神奇的方式获取原始字节,到底是怎么回事?能解释一下吗?
11 楼
hideto
2007-07-07
我觉得应该与Class loadClass( String name, boolean resolve )方法中的resolve属性有关:
D)resolveClass
可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时可以调用resolveClass,这取决于loadClass的resolve参数的值。
但不知道是参考资料比较老还是什么原因,我现在在JDK6.0上手动调用resolveClass后仍然报ClassCastException,api文档也不够详细,暂时没找到原因,大家一起探讨吧。
引用
D)resolveClass
可以不完全地(不带解析)装入类,也可以完全地(带解析)装入类。当编写我们自己的loadClass时可以调用resolveClass,这取决于loadClass的resolve参数的值。
但不知道是参考资料比较老还是什么原因,我现在在JDK6.0上手动调用resolveClass后仍然报ClassCastException,api文档也不够详细,暂时没找到原因,大家一起探讨吧。
10 楼
tangyi198388
2007-07-07
FileClassLoader loader = new FileClassLoader(); Class objClass = loader.findClass("MyApp"); Object obj = objClass.newInstance();
请问用Object obj = objClass.newInstance();得到的对象是不是只包括该MyApp的基本信息,它是不是不能向下转型到MyApp呢?
我在列子中直接用loader.findClass("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时报类型转化异常.
而我在列子中直接用loader.loadClass ("MyApp")得到的Class对象在用newInstance()方法得到一个实例,把这个实例向下转型到MyApp时可以正确转化.
我的理解是用loader.findClass("MyApp")得到的Class对象并没有真正加载,但可以用它得到类的一些信息,但是用loader.loadClass ("MyApp")得到的Class对象是真正加载到JVM中的.
不知道我的理解对不对?
9 楼
voff12
2007-07-06
very good!谢谢分享!
8 楼
zjumty
2007-07-06
不错,Mark
7 楼
笨鸟先飞
2007-07-06
不错!可谓精华帖啊!
6 楼
younggun
2007-07-06
真不错,hideto可以深入再继续
5 楼
那年夏天
2007-07-06
收藏了,最近正打算研究这些东西的呢
4 楼
youlq
2007-07-06
写得真好,言简意赅,参考资料也很有帮助。
3 楼
hideto
2007-07-05
四、cglib
cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime.
cglib是Code Generation Library的缩写。
cglib依赖于ASM库。
Hibernate主要是利用cglib生成pojo的子类并override get方法来实现lazy loading机制,Spring则是利用cglib来实现动态代理。
而JDK的动态代理机制要求有接口才行,这样就强制我们的pojo实现某个接口。
这里还是提供一个cglib的入门级的示例:
MyClass.java:
Main.java:
打印结果为:
这个示例就基本上实现了日志AOP的功能,很简单吧。
参考资料
CLR和JRE的运行机制的初步总结
Java虚拟机
了解Java ClassLoader
Java Virtual Machine Specification
Java bytecode
解读字节码文件
Java Bytecode Specification and Verification
ASM User Guide
Hello, ASM
cglig指南
Java下的框架编程--cglib的应用
AOP = Proxy Pattern + Method Reflection + Aspect DSL + 自动代码生成
深入浅出Spring AOP
cglib is a powerful, high performance and quality Code Generation Library, It is used to extend JAVA classes and implements interfaces at runtime.
cglib是Code Generation Library的缩写。
cglib依赖于ASM库。
Hibernate主要是利用cglib生成pojo的子类并override get方法来实现lazy loading机制,Spring则是利用cglib来实现动态代理。
而JDK的动态代理机制要求有接口才行,这样就强制我们的pojo实现某个接口。
这里还是提供一个cglib的入门级的示例:
MyClass.java:
public class MyClass { public void print() { System.out.println("I'm in MyClass.print!"); } }
Main.java:
import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class Main { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyClass.class); enhancer.setCallback(new MethodInterceptorImpl()); MyClass my = (MyClass) enhancer.create(); my.print(); } private static class MethodInterceptorImpl implements MethodInterceptor { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // log something System.out.println(method + " intercepted!"); proxy.invokeSuper(obj, args); return null; } } }
打印结果为:
public void MyClass.print() intercepted! I'm in MyClass.print!
这个示例就基本上实现了日志AOP的功能,很简单吧。
参考资料
CLR和JRE的运行机制的初步总结
Java虚拟机
了解Java ClassLoader
Java Virtual Machine Specification
Java bytecode
解读字节码文件
Java Bytecode Specification and Verification
ASM User Guide
Hello, ASM
cglig指南
Java下的框架编程--cglib的应用
AOP = Proxy Pattern + Method Reflection + Aspect DSL + 自动代码生成
深入浅出Spring AOP
2 楼
hideto
2007-07-05
三、ASM
我们知道Java是静态语言,而python、ruby是动态语言,Java程序一旦写好很难在运行时更改类的行为,而python、ruby可以。
不过基于bytecode层面上我们可以做一些手脚,来使Java程序多一些灵活性和Magic,ASM就是这样一个应用广泛的开源库。
ASM is a Java bytecode manipulation framework. It can be used to dynamically generate stub classes or other proxy classes,
directly in binary form, or to dynamically modify classes at load time, i.e., just before they are loaded into the Java
Virtual Machine.
ASM完成了BCEL和SERP同样的功能,但ASM
只有30多k,而后两者分别是350k和150k。apache真是越来越过气了。
让我们来看一个ASM的简单例子Helloworld.java,它生成一个Example类和一个main方法,main方法打印"Hello world!"语句:
我们看到上面的例子分别使用ASM的MethodVisitor和GeneratorAdapter两种方式来动态生成Example类并调用打印语句。
我们知道Java是静态语言,而python、ruby是动态语言,Java程序一旦写好很难在运行时更改类的行为,而python、ruby可以。
不过基于bytecode层面上我们可以做一些手脚,来使Java程序多一些灵活性和Magic,ASM就是这样一个应用广泛的开源库。
ASM is a Java bytecode manipulation framework. It can be used to dynamically generate stub classes or other proxy classes,
directly in binary form, or to dynamically modify classes at load time, i.e., just before they are loaded into the Java
Virtual Machine.
ASM完成了BCEL和SERP同样的功能,但ASM
只有30多k,而后两者分别是350k和150k。apache真是越来越过气了。
让我们来看一个ASM的简单例子Helloworld.java,它生成一个Example类和一个main方法,main方法打印"Hello world!"语句:
import java.io.FileOutputStream; import java.io.PrintStream; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.GeneratorAdapter; import org.objectweb.asm.commons.Method; public class Helloworld extends ClassLoader implements Opcodes { public static void main(final String args[]) throws Exception { // creates a ClassWriter for the Example public class, // which inherits from Object ClassWriter cw = new ClassWriter(0); cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null); MethodVisitor mw = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); mw.visitVarInsn(ALOAD, 0); mw.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); mw.visitInsn(RETURN); mw.visitMaxs(1, 1); mw.visitEnd(); mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mw.visitLdcInsn("Hello world!"); mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mw.visitInsn(RETURN); mw.visitMaxs(2, 2); mw.visitEnd(); byte[] code = cw.toByteArray(); FileOutputStream fos = new FileOutputStream("Example.class"); fos.write(code); fos.close(); Helloworld loader = new Helloworld(); Class exampleClass = loader .defineClass("Example", code, 0, code.length); exampleClass.getMethods()[0].invoke(null, new Object[] { null }); // ------------------------------------------------------------------------ // Same example with a GeneratorAdapter (more convenient but slower) // ------------------------------------------------------------------------ cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(V1_1, ACC_PUBLIC, "Example", null, "java/lang/Object", null); Method m = Method.getMethod("void <init> ()"); GeneratorAdapter mg = new GeneratorAdapter(ACC_PUBLIC, m, null, null, cw); mg.loadThis(); mg.invokeConstructor(Type.getType(Object.class), m); mg.returnValue(); mg.endMethod(); m = Method.getMethod("void main (String[])"); mg = new GeneratorAdapter(ACC_PUBLIC + ACC_STATIC, m, null, null, cw); mg.getStatic(Type.getType(System.class), "out", Type .getType(PrintStream.class)); mg.push("Hello world!"); mg.invokeVirtual(Type.getType(PrintStream.class), Method .getMethod("void println (String)")); mg.returnValue(); mg.endMethod(); cw.visitEnd(); code = cw.toByteArray(); loader = new Helloworld(); exampleClass = loader.defineClass("Example", code, 0, code.length); exampleClass.getMethods()[0].invoke(null, new Object[] { null }); } }
我们看到上面的例子分别使用ASM的MethodVisitor和GeneratorAdapter两种方式来动态生成Example类并调用打印语句。
发表评论
-
Ubuntu 11.10 安装Java、JIRA/Confluence/FishEye、Nginx
2012-03-01 22:26 47041. 替换Ubuntu源 编辑/etc/apt/source. ... -
Android开发WeatherForecast程序
2009-03-28 13:38 63061,使用Googel API http://www.googl ... -
Android程序开发入门
2009-03-26 14:26 30401, 安装软件 1) JDK 2) Eclipse 3) AD ... -
Spring与ThreadLocal的讨论
2007-07-31 12:27 3927Singleton是不能使用非Singleton的实例的 比如 ... -
Spring基础培训ppt
2007-07-30 19:34 6271做ppt还真是累 更新了一下ppt. -
使用Jetty和DWR创建伸缩性Comet程序
2007-07-28 21:11 7547Ajax for Java developers: Write ... -
Java代码规范
2007-07-19 01:12 3460http://java.sun.com/docs/codeco ... -
Spring JavaConfig参考文档
2007-07-14 18:37 12846Spring JavaConfig参考文档 Spring Ja ... -
Tiger in the house
2007-07-14 02:49 8315很高兴花周五晚上2个小时的时间来阅读这样一本实用的书 -- 《 ... -
Java里判断Image文件信息格式(GIF/PNG/JPG)/Size/Height/Width?
2007-06-05 18:01 93101,判断Image格式 用UE打开GIF/PNG/JPG格式的 ... -
推荐轻量级面向服务Web开发库Objot
2007-05-27 22:17 3213Objot是我们公司Aragon Consulting Gro ... -
实战Mule:利用Mule调用XFire发布的文件上传服务
2007-03-27 15:17 5958配置Mule和XFire环境 参考前面的文章实战Mule:利用 ... -
实战Mule:利用Mule调用XFire发布的Web服务
2007-03-26 17:26 9434下载和安装XFire和Mule 参考http://hideto ... -
开源ESB引擎Mule初印象
2007-03-22 18:13 10690Mule is the leading open source ... -
XFire快速上手
2007-03-14 11:53 6728下载XFrie 首先,去http://xfire.codeha ... -
学习Eclipse RCP之Hello World
2007-03-12 17:57 4263创建插件项目 打开Eclipse并选择File->New ... -
Google Web Toolkit上手指南
2007-03-12 16:07 4813目录 安装Google Web Toolkit 构建一个简单的 ... -
5分钟学习Maven2
2007-03-12 01:12 5968安装 Maven是一个Java工具,所以你必须安装Java环境 ... -
在UDDI注册中心里使用WSDL
2007-03-09 15:55 7347原文链接:http://www.oasis-open.org/ ... -
Axis2快速上手指南
2007-03-01 23:22 74391原文链接:http://ws.apache.org/axis2 ...
相关推荐
一、项目简介 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷 二、技术实现 jdk版本:1.8 及以上 ide工具:IDEA或者eclipse 数据库: mysql5.5及以上 后端:spring+springboot+mybatis+maven+mysql 前端: vue , css,js , elementui 三、系统功能 1、系统角色主要包括:管理员、用户 2、系统功能 前台功能包括: 用户登录 车位展示 系统推荐车位 立即预约 公告展示 个人中心 车位预定 违规 余额充值 后台功能: 首页,个人中心,修改密码,个人信息 用户管理 管理员管理 车辆管理 车位管理 车位预定管理,统计报表 公告管理 违规管理 公告类型管理 车位类型管理 车辆类型管理 违规类型管理 轮播图管理 详见 https://flypeppa.blog.csdn.net/article/details/146122666
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql 部署环境:maven 数据库工具:navica 更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185
内容为Python程序设计的思维导图,适用于新手小白进行浏览,理清思路
2024-Stable Diffusion全套资料(软件+关键词+模型).rar
mmexport1741417035005.png
COMSOL三维锂离子电池全耦合电化学热应力模型:模拟充放电过程中的多物理场耦合效应及电芯内应力应变情况,COMSOL锂离子电池热应力全耦合模型,comsol三维锂离子电池电化学热应力全耦合模型锂离子电池耦合COMSOL固体力学模块和固体传热模块,模型仿真模拟电池在充放电过程中由于锂插层,热膨胀以及外部约束所导致的电极的应力应变情况结果有电芯中集流体,电极,隔膜的应力应变以及压力情况等,电化学-力单向耦合和双向耦合 ,关键词: 1. COMSOL三维锂离子电池模型; 2. 电化学热应力全耦合模型; 3. 锂离子电池; 4. 固体力学模块; 5. 固体传热模块; 6. 应力应变情况; 7. 电芯中集流体; 8. 电极; 9. 隔膜; 10. 电化学-力单向/双向耦合。,COMSOL锂离子电池全耦合热应力仿真模型
基于传递矩阵法的一维层状声子晶体振动传输特性及其优化设计与应用,声子晶体传递矩阵法解析及应用,Matlab 一维层状声子晶体振动传输特性 传递矩阵法在声子晶体的设计和应用中具有重要作用。 通过调整声子晶体的材料、周期和晶格常数等参数,可以设计出具有特定带隙结构的声子晶体,用于滤波、减震、降噪等应用。 例如,通过调整声子晶体的周期数和晶格常数,可以改变带隙的位置和宽度,从而实现特定的频率范围内的噪声控制。 此外,传递矩阵法还可以用于分析和优化声子晶体的透射谱,为声学器件的设计提供理论依据。 ,Matlab; 一维层状声子晶体; 振动传输特性; 传递矩阵法; 材料调整; 周期和晶格常数; 带隙结构; 滤波; 减震; 降噪; 透射谱分析; 声学器件设计,Matlab模拟声子晶体振动传输特性及优化设计研究
头部姿态估计(HeadPose Estimation)-Android源码
永磁同步电机FOC、MPC与高频注入Simulink模型及基于MBD的代码生成工具,适用于Ti f28335与dspace/ccs平台开发,含电机控制开发文档,永磁同步电机控制技术:FOC、MPC与高频注入Simulink模型开发及应用指南,提供永磁同步电机FOC,MPC,高频注入simulink模型。 提供基于模型开发(MBD)代码生成模型,可结合Ti f28335进行电机模型快速开发,可适用dspace平台或者ccs平台。 提供电机控制开发编码器,转子位置定向,pid调试相关文档。 ,永磁同步电机; FOC控制; MPC控制; 高频注入; Simulink模型; 模型开发(MBD); Ti f28335; 电机模型开发; dspace平台; ccs平台; 编码器; 转子位置定向; pid调试。,永磁同步电机MPC-FOC控制与代码生成模型
light of warehouse.zip
内容概要:文章深入讨论了工业乙醇发酵的基本原理及工艺流程,特别是在温度和气体排放(如CO2及其他有害气体)影响下的发酵效果分析。文章介绍了乙醇发酵的重要环节,如糖分解、代谢路径、代谢调控以及各阶段的操作流程,重点展示了如何通过Matlab建模和仿真实验来探索这两个关键环境因素对发酵过程的具体影响。通过动态模型仿真分析,得出合适的温度范围以及适时排除CO2能显著提升发酵产乙醇的效果与效率,从而提出了基于仿真的优化发酵生产工艺的新方法。 适用人群:从事生物工程相关领域研究的科学家、工程师及相关专业师生。 使用场景及目标:适用于实验室环境、学术交流会议及实际生产指导中,以提升研究人员对该领域内复杂现象的理解能力和技术水平为目标。 其他说明:附录中有详细的数学公式表达和程序代码可供下载执行,便于有兴趣的研究团队重复实验或者继续扩展研究工作。
本资源包专为解决 Tomcat 启动时提示「CATALINA_HOME 环境变量未正确配置」问题而整理,包含以下内容: 1. **Apache Tomcat 9.0.69 官方安装包**:已验证兼容性,解压即用。 2. **环境变量配置指南**: - Windows 系统下 `CATALINA_HOME` 和 `JAVA_HOME` 的详细配置步骤。 - 常见错误排查方法(如路径含空格、未生效问题)。 3. **辅助工具脚本**:一键检测环境变量是否生效的批处理文件。 4. **解决方案文档**:图文并茂的 PDF 文档,涵盖从报错分析到成功启动的全流程。 适用场景: - Tomcat 9.x 版本环境配置 - Java Web 开发环境搭建 - 运维部署调试 注意事项: - 资源包路径需为纯英文,避免特殊字符。 - 建议使用 JDK 8 或更高版本。
这是一款仿照京东商城的Java Web项目源码,完美复现了360buy的用户界面和购物流程,非常适合Java初学者和开发者进行学习与实践。通过这份源码,你将深入了解电商平台的架构设计和实现方法。欢迎大家下载体验,提升自己的编程能力!
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
这是一款专为大学生打造的求职就业网JavaWeb毕业设计源码,功能齐全,界面友好。它提供简历投递、职位搜索、在线交流等多种实用功能,能够帮助你顺利进入职场。无论你是想提升技术水平还是寻找灵感,这个源码都是不可多得的资源。快来下载,让你的求职之路更加顺畅吧!
useTable(1).ts
实验一: 1、进行CCS6.1软件的安装,仿真器的设置,程序的编译和调试; 2、熟悉CCS软件中的C语言编程; 3、使用按键控制LED跑马灯的开始与停止、闪烁频率; 4、调试Convolution、FFT、FIR、FFT-FIR实验,编制IIR算法并调试,并在CCS软件上给出实验结果。 实验二: 1、利用定时器周期中断或下溢中断和比较器比较值的修改来实现占空比可调的PWM波形; 2、改变PWM占空比控制LED灯的亮暗,按键实现10级LED灯亮暗调整; 3、模拟数字转换,转换过程中LED指示,并在变量窗口显示转换结果; 4、数字模拟转换,产生一个正弦波,转换过程中LED指示,转换完成后在CCS调试窗口显示波形。 实验三: 1、SCI异步串行通信实验; 2、SPI及IIC同步串行通信实验; 3、CAN现场总线串行通信实验; 4、传输过程中LED指示。 实验四: 1、电机转速控制实验。
LINUX系统管理与配置.docx
chromedriver-mac-x64-136.0.7055.0.zip
地级城市驻地,dbf 地级城市驻地,prj 地级城市驻地.sbn 9 地级城市驻地.sbx 地级城市驻地.shp 地级城市驻地.shx 9 国界线.dbf 国界线.prj 国界线.sbne 国界线.sbx 国界线.shp 国界线.shx )经纬网.dbf ]经纬网.prj 经纬网.sbn 经纬网.sbx 经纬网.shp 经纬网.shx 全国县级统计数据.dbf 全国县级统计数据,prj 全国县级统计数据.sbr 全国县级统计数据.sbx 全国县级统计数据.shp 全国县级统计数据.shx )省会城市.dbf 省会城市,prj 省会城市.sbn 省会城市.sbx 省会城市.shp 省会城市.shx 省级行政区.dbf 省级行政区,pn 省级行政区.sbn 省级行政区,sbx 9 省级行政区.shp 9 6 省级行政区,shx 县城驻地.dbf 县城驻地,prj 擷垃岑械鰣媛城驻地.sbr 藶勇瑁鴎隐城驻地.sbx 县蓿玨蒴城驻地.shp 苽6城驻地,shx 线状省界.dbf 线状省界,prj 1线状首界,sbn 线状省界.sbx 线状首界.shp 线状省界,shx 线状县界,dbf □]