初识ASM,简单的HelloWord
2012-03-23 20:42
197 查看
今天看到一个很有趣的ASM+Spring的应用写法.可以根据接口定义自动生成具体的Dao.主要还是ASM不熟悉.所以决定从基础看起来.比如我要定义个类:public class Example
{
public void Hello(String str)
{
System.out.println("Hello world! " + str);
}
}
如果我要定义一个ASM动态生成则:
public static void main(final String args[]) throws Exception
{
/*
* 如果我要生成一个如下的java代码:
*
* public void Hello(String str)
* {
* System.out.println("Hello world! " + str);
* }
*/
// 定义ClassWriter 准备写类
ClassWriter cw = new ClassWriter(0);
cw.visit(V1_6, 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();
//创建Hello方法 ,形参是 String
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,
"Hello",
"(Ljava/lang/String;)V",
null,
null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(12, l0);
mv.visitFieldInsn(GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;");
mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
mv.visitInsn(DUP);
mv.visitLdcInsn("Hello world! ");
mv.visitMethodInsn(INVOKESPECIAL,
"java/lang/StringBuffer",
"<init>",
"(Ljava/lang/String;)V");
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/StringBuffer",
"append",
"(Ljava/lang/String;)Ljava/lang/StringBuffer;");
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/StringBuffer",
"toString",
"()Ljava/lang/String;");
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/io/PrintStream",
"println",
"(Ljava/lang/String;)V");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(13, l1);
mv.visitInsn(RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this", "Lcom/test/Example;", null, l0, l2, 0);
mv.visitLocalVariable("str", "Ljava/lang/String;", null, l0, l2, 1);
mv.visitMaxs(4, 2);
mv.visitEnd();
/*
* 写入文件
*/
byte[] code = cw.toByteArray();
FileOutputStream fos = new FileOutputStream("Example.class");
fos.write(code);
fos.close();
/*
* 从文件加载类
*/
HelloWord loader = new HelloWord();
Class exampleClass = loader.defineClass("Example", code, 0, code.length);
/*
* 反射生成类,并传入参数
*/
Object obj = exampleClass.getConstructor(null).newInstance(null);
exampleClass.getMethod("Hello", new Class[] {String.class})
.invoke(obj, new Object[] {"zjy"});
}
最后输出就
Hello world! zjy
{
public void Hello(String str)
{
System.out.println("Hello world! " + str);
}
}
如果我要定义一个ASM动态生成则:
public static void main(final String args[]) throws Exception
{
/*
* 如果我要生成一个如下的java代码:
*
* public void Hello(String str)
* {
* System.out.println("Hello world! " + str);
* }
*/
// 定义ClassWriter 准备写类
ClassWriter cw = new ClassWriter(0);
cw.visit(V1_6, 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();
//创建Hello方法 ,形参是 String
MethodVisitor mv = cw.visitMethod(ACC_PUBLIC,
"Hello",
"(Ljava/lang/String;)V",
null,
null);
mv.visitCode();
Label l0 = new Label();
mv.visitLabel(l0);
mv.visitLineNumber(12, l0);
mv.visitFieldInsn(GETSTATIC,
"java/lang/System",
"out",
"Ljava/io/PrintStream;");
mv.visitTypeInsn(NEW, "java/lang/StringBuffer");
mv.visitInsn(DUP);
mv.visitLdcInsn("Hello world! ");
mv.visitMethodInsn(INVOKESPECIAL,
"java/lang/StringBuffer",
"<init>",
"(Ljava/lang/String;)V");
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/StringBuffer",
"append",
"(Ljava/lang/String;)Ljava/lang/StringBuffer;");
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/lang/StringBuffer",
"toString",
"()Ljava/lang/String;");
mv.visitMethodInsn(INVOKEVIRTUAL,
"java/io/PrintStream",
"println",
"(Ljava/lang/String;)V");
Label l1 = new Label();
mv.visitLabel(l1);
mv.visitLineNumber(13, l1);
mv.visitInsn(RETURN);
Label l2 = new Label();
mv.visitLabel(l2);
mv.visitLocalVariable("this", "Lcom/test/Example;", null, l0, l2, 0);
mv.visitLocalVariable("str", "Ljava/lang/String;", null, l0, l2, 1);
mv.visitMaxs(4, 2);
mv.visitEnd();
/*
* 写入文件
*/
byte[] code = cw.toByteArray();
FileOutputStream fos = new FileOutputStream("Example.class");
fos.write(code);
fos.close();
/*
* 从文件加载类
*/
HelloWord loader = new HelloWord();
Class exampleClass = loader.defineClass("Example", code, 0, code.length);
/*
* 反射生成类,并传入参数
*/
Object obj = exampleClass.getConstructor(null).newInstance(null);
exampleClass.getMethod("Hello", new Class[] {String.class})
.invoke(obj, new Object[] {"zjy"});
}
最后输出就
Hello world! zjy
相关文章推荐
- 初识RAC:001--Block简单使用
- 初识FPGA及三个简单仿真实验报告
- OC初识之简单的OC程序
- 初识Android之简单实例二
- 初识树结构,简单模拟无规律的二叉树,实现二叉树的构建,计算树的深度以及三种遍历方式以及搜索删除,销毁整个树
- Oracle+ASM单机环境下,开启归档的最简单的方法
- 系统的简单注解 - 2 core.asm文件
- GO语言练习:实现最简单的http helloword 服务器
- ASM简单管理
- 初识python,编写一个简单的python程序
- 初识服务发现及Consul框架的简单使用
- GEF最简单的入门-helloword(1)
- C++第1次实验(基础班)—初识C++【项目3-简单分支问题体验】
- ASM 5.0.3 主要类的关系和简单实例
- 初识简单却不失优雅的Vue.js
- 初识Android之简单实例
- 初识Bootstrap及制作一个简单的页面
- 一步一步写web之初识web(五-简单源码分析篇)
- 【MongoDB初识】-结合C#简单使用,驱动2.x
- 利用WF开发简单的HelloWord程序