Skip to content

Commit ffcd1f7

Browse files
committed
上传文件
1 parent c0b3d5d commit ffcd1f7

File tree

5 files changed

+86
-0
lines changed

5 files changed

+86
-0
lines changed

java-knowledge-base/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
<artifactId>cglib</artifactId>
2222
<version>3.2.4</version>
2323
</dependency>
24+
<dependency>
25+
<groupId>javassist</groupId>
26+
<artifactId>javassist</artifactId>
27+
<version>3.8.0.GA</version>
28+
</dependency>
2429
</dependencies>
2530

2631

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package base.bytecode;
2+
3+
import org.objectweb.asm.ClassWriter;
4+
import org.objectweb.asm.MethodVisitor;
5+
import org.objectweb.asm.Opcodes;
6+
7+
import java.io.File;
8+
import java.io.FileOutputStream;
9+
import java.io.IOException;
10+
11+
/**
12+
* @author zhangluping on 2018/8/21.
13+
*/
14+
public class ASMCodeGenerator {
15+
public static void main(String[] args) throws IOException {
16+
17+
System.out.println();
18+
ClassWriter classWriter = new ClassWriter(0);
19+
// 通过visit方法确定类的头部信息
20+
classWriter.visit(Opcodes.V1_7,// java版本
21+
Opcodes.ACC_PUBLIC,// 类修饰符
22+
"ASMProgrammer", // 类的全限定名
23+
null, "java/lang/Object", null);
24+
25+
//创建构造函数
26+
MethodVisitor mv = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
27+
mv.visitCode();
28+
mv.visitVarInsn(Opcodes.ALOAD, 0);
29+
mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
30+
mv.visitInsn(Opcodes.RETURN);
31+
mv.visitMaxs(1, 1);
32+
mv.visitEnd();
33+
34+
// 定义code方法
35+
MethodVisitor methodVisitor = classWriter.visitMethod(Opcodes.ACC_PUBLIC, "code", "()V",
36+
null, null);
37+
methodVisitor.visitCode();
38+
methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out",
39+
"Ljava/io/PrintStream;");
40+
methodVisitor.visitLdcInsn("I'm a Programmer,Just Coding.....");
41+
methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
42+
"(Ljava/lang/String;)V");
43+
methodVisitor.visitInsn(Opcodes.RETURN);
44+
methodVisitor.visitMaxs(2, 2);
45+
methodVisitor.visitEnd();
46+
classWriter.visitEnd();
47+
// 使classWriter类已经完成
48+
// 将classWriter转换成字节数组写到文件里面去
49+
byte[] data = classWriter.toByteArray();
50+
File file = new File("d://ASMProgrammer.class");
51+
FileOutputStream fout = new FileOutputStream(file);
52+
fout.write(data);
53+
fout.close();
54+
}
55+
}
340 Bytes
Binary file not shown.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package base.bytecode;
2+
3+
import javassist.ClassPool;
4+
import javassist.CtClass;
5+
import javassist.CtMethod;
6+
import javassist.CtNewMethod;
7+
8+
/**
9+
* @author zhangluping on 2018/8/21.
10+
*/
11+
public class JavassistCodeGenerator {
12+
13+
public static void main(String[] args) throws Exception {
14+
ClassPool pool = ClassPool.getDefault();
15+
//创建Programmer类
16+
CtClass cc = pool.makeClass("com.samples.JavassistProgrammer");
17+
//定义code方法
18+
CtMethod method = CtNewMethod.make("public void code(){}", cc);
19+
//插入方法代码
20+
method.insertBefore("System.out.println(\"I'm a Programmer,Just Coding.....\");");
21+
cc.addMethod(method);
22+
//保存生成的字节码
23+
cc.writeFile("d://");
24+
}
25+
26+
}
Binary file not shown.

0 commit comments

Comments
 (0)