OSDN Git Service

opcodesをcflibに変更した.コントロールフローを扱うことと,ライブラリであることを明示したかったため.
[stigmata/stigmata-plugins.git] / cflib / src / test / resources / resources / MyServerBuilder.java
1 import java.io.*;
2 import org.objectweb.asm.*;
3 import org.objectweb.asm.tree.*;
4
5 /**
6  * 以下の原稿にあるクラスファイルを作成するためのクラス.
7  * ASMを使ってバイトコードを直接生成している.
8  * <ul>
9  *   <li>Heewan Park, Hyun-il Lim, Seokwoo Choi, Taisook Han, ``Detecting Common Modules in Java Packages Based on Static Object Trace Birthmark,'' The Computer Journal (Advance Access), Nov 5 2009, doi:10.1093/comjnl/bxp095</li>
10  * </ul>
11  */
12 public class MyServerBuilder{
13     public MyServerBuilder(){
14     }
15
16     public void write(OutputStream out) throws Exception{
17         ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
18
19         writer.visit(50, Opcodes.ACC_PUBLIC, "MyServer", null, "java/lang/Object", null);
20         FieldVisitor fv1 = writer.visitField(Opcodes.ACC_PRIVATE, "Port", "I", null, 9999);
21         fv1.visitEnd();
22         FieldVisitor fv2 = writer.visitField(Opcodes.ACC_PRIVATE, "Sock", "Ljava/net/ServerSocket;", null, null);
23         fv2.visitEnd();
24         MethodVisitor mv = writer.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "(I)V", null, null);
25
26         Label label1 = new Label();
27         Label label2 = new Label();
28         Label label3 = new Label();
29         Label startTry = new Label();
30         Label catchLabel = new Label();
31         mv.visitCode();
32         mv.visitVarInsn(Opcodes.ALOAD, 0);
33         mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
34         mv.visitVarInsn(Opcodes.ALOAD, 0);
35         mv.visitIntInsn(Opcodes.SIPUSH, 9999);
36         mv.visitFieldInsn(Opcodes.PUTFIELD, "MyServer", "Port", "I");
37         mv.visitLabel(startTry);
38         mv.visitVarInsn(Opcodes.ILOAD, 1);
39         mv.visitJumpInsn(Opcodes.IFLE, label1);
40         mv.visitVarInsn(Opcodes.ALOAD, 0);
41         mv.visitVarInsn(Opcodes.ILOAD, 1);
42         mv.visitFieldInsn(Opcodes.PUTFIELD, "MyServer", "Port", "I");
43         mv.visitVarInsn(Opcodes.ALOAD, 0);
44         mv.visitTypeInsn(Opcodes.NEW, "java/net/ServerSocket");
45         mv.visitInsn(Opcodes.DUP);
46         mv.visitVarInsn(Opcodes.ILOAD, 1);
47         mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/net/ServerSocket", "<init>", "(I)V");
48         mv.visitFieldInsn(Opcodes.PUTFIELD, "MyServer", "Sock", "Ljava/net/ServerSocket;");
49         mv.visitJumpInsn(Opcodes.GOTO, label2);
50         mv.visitLabel(label1);
51         mv.visitVarInsn(Opcodes.ALOAD, 0);
52         mv.visitTypeInsn(Opcodes.NEW, "java/net/ServerSocket");
53         mv.visitInsn(Opcodes.DUP);
54         mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/net/ServerSocket", "<init>", "()V");
55         mv.visitFieldInsn(Opcodes.PUTFIELD, "MyServer", "Sock", "Ljava/net/ServerSocket;");
56         mv.visitLabel(label2);
57         mv.visitJumpInsn(Opcodes.GOTO, label3);
58         mv.visitLabel(catchLabel);
59         mv.visitVarInsn(Opcodes.ASTORE, 2);
60         mv.visitLabel(label3);
61         mv.visitInsn(Opcodes.RETURN);
62         mv.visitTryCatchBlock(startTry, label2, catchLabel, "java/io/IOException");
63         mv.visitEnd();
64         writer.visitEnd();
65
66         out.write(writer.toByteArray());
67     }
68
69     public static void main(String[] args) throws Exception{
70         MyServerBuilder builder = new MyServerBuilder();
71
72         OutputStream out = new FileOutputStream(args[0]);
73         builder.write(out);
74         out.close();
75     }
76 }