annotate src/main/java/alice/codesegment/CreateCodeSegment.java @ 633:746447b7c3e0

add CreateCodeSegment Factory
author Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
date Fri, 01 Dec 2017 01:10:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
633
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 package alice.codesegment;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 import alice.Annotation.AliceAnnotation;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 import alice.Annotation.Take;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 import alice.datasegment.CommandType;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 import alice.datasegment.Receiver;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 import javassist.*;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 import javassist.tools.reflect.Sample;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 import sun.jvm.hotspot.oops.Instance;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 import java.lang.reflect.Constructor;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 import java.lang.reflect.Field;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 import java.security.ProtectionDomain;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 /**
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 * Created by e125769 on 11/30/17.
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 */
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 public class CreateCodeSegment {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 private Class cs;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 public CreateCodeSegment(Class cs){
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 this.cs = cs;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 ClassPool cp = ClassPool.getDefault();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 cp.appendSystemPath();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 CtClass cc = null;
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 try {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 cc = cp.get(cs.getName());
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 } catch (NotFoundException e) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 e.printStackTrace();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 for (Field field : cs.getDeclaredFields()) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 if (field.isAnnotationPresent(Take.class)){
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 System.out.println(field.getName());
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 System.out.println(field.getType());
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 Take ano = field.getAnnotation(Take.class);
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 System.out.println(ano.value());
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 try {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 //Receiverを生成
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 CtField cf = CtField.make("public alice.datasegment.Receiver " + ano.value() + " = ids.create(alice.datasegment.CommandType.TAKE);",cc);
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 cc.addField(cf);
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 //setKey
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 for (CtConstructor ctConstructors : cc.getConstructors()){
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 ctConstructors.setBody(ano.value() + ".setKey(\"" +ano.value() + "\");");
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 //cc.setModifiers(cc.getModifiers());
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 } catch (CannotCompileException e) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 e.printStackTrace();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 try {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 ClassLoader loader = ClassLoader.getSystemClassLoader();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 ProtectionDomain domain = Sample.class.getProtectionDomain();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 this.cs = cc.toClass(loader, domain);//ここで止まる。toClass()以前にクラスを1つでもloadしていたら動かない(怒)
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 } catch (CannotCompileException e) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 e.printStackTrace();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 public void run(){
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 try {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 cs.newInstance();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 } catch (InstantiationException e) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 e.printStackTrace();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 } catch (IllegalAccessException e) {
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 e.printStackTrace();
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 }
746447b7c3e0 add CreateCodeSegment Factory
Nozomi Teruya <e125769@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 }