1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.bcel;
19
20 import java.io.IOException;
21 import java.io.OutputStream;
22 import java.nio.file.Files;
23 import java.nio.file.Path;
24 import java.nio.file.Paths;
25
26 import org.apache.bcel.generic.ArrayType;
27 import org.apache.bcel.generic.ClassGen;
28 import org.apache.bcel.generic.ConstantPoolGen;
29 import org.apache.bcel.generic.InstructionFactory;
30 import org.apache.bcel.generic.InstructionList;
31 import org.apache.bcel.generic.MethodGen;
32 import org.apache.bcel.generic.Type;
33
34 public class HelloWorldCreator {
35 private static final String ORG_APACHE_BCEL_HELLO_WORLD = "org.apache.bcel.HelloWorld";
36 public static void main(final String[] args) throws Exception {
37 final org.apache.bcel.HelloWorldCreator creator = new org.apache.bcel.HelloWorldCreator();
38 final Path path = Paths.get("target/test-classes/org/apache/bcel/HelloWorld.class");
39 Files.deleteIfExists(path);
40 try (OutputStream out = Files.newOutputStream(path)) {
41 creator.create(out);
42 }
43 }
44 private final InstructionFactory factory;
45 private final ConstantPoolGen cp;
46
47 private final ClassGen cg;
48
49 public HelloWorldCreator() {
50 cg = new ClassGen(ORG_APACHE_BCEL_HELLO_WORLD, "java.lang.Object", "HelloWorld.java", Const.ACC_PUBLIC | Const.ACC_SUPER, new String[] {});
51 cg.setMajor(Const.MAJOR_1_8);
52 cg.setMinor(Const.MINOR_1_8);
53
54 cp = cg.getConstantPool();
55 factory = new InstructionFactory(cg, cp);
56 }
57
58 public void create(final OutputStream out) throws IOException {
59 createConstructor();
60 createMainMethod();
61 cg.getJavaClass().dump(out);
62 }
63
64 private void createConstructor() {
65 final InstructionList il = new InstructionList();
66 final MethodGen method = new MethodGen(Const.ACC_PUBLIC, Type.VOID, Type.NO_ARGS, new String[] {}, "<init>", ORG_APACHE_BCEL_HELLO_WORLD, il, cp);
67
68 il.append(InstructionFactory.createLoad(Type.OBJECT, 0));
69 il.append(factory.createInvoke("java.lang.Object", "<init>", Type.VOID, Type.NO_ARGS, Const.INVOKESPECIAL));
70 il.append(InstructionFactory.createReturn(Type.VOID));
71 method.setMaxStack();
72 method.setMaxLocals();
73 cg.addMethod(method.getMethod());
74 il.dispose();
75 }
76
77 private void createMainMethod() {
78 final InstructionList il = factory.createPrintln("Hello World!");
79 final MethodGen method = new MethodGen(Const.ACC_PUBLIC | Const.ACC_STATIC, Type.VOID, new Type[] { new ArrayType(Type.STRING, 1) }, new String[] { "arg0" }, "main",
80 ORG_APACHE_BCEL_HELLO_WORLD, il, cp);
81
82 il.append(InstructionFactory.createReturn(Type.VOID));
83 method.setMaxStack();
84 method.setMaxLocals();
85 cg.addMethod(method.getMethod());
86 il.dispose();
87 }
88 }