413
|
1 package alice.test.reflection;
|
355
|
2
|
412
|
3 import javassist.CannotCompileException;
|
|
4 import javassist.ClassPool;
|
|
5 import javassist.CtClass;
|
|
6 import javassist.CtField;
|
417
|
7 import javassist.CtMethod;
|
412
|
8 import javassist.CtNewConstructor;
|
417
|
9 import javassist.CtNewMethod;
|
412
|
10 import javassist.NotFoundException;
|
417
|
11 import javassist.bytecode.AccessFlag;
|
355
|
12
|
412
|
13 public class DisposeManager {
|
417
|
14 private static DisposeManager instance = new DisposeManager();
|
|
15 private ClassPool cp = ClassPool.getDefault();
|
412
|
16
|
417
|
17 private DisposeManager(){}
|
412
|
18
|
417
|
19 public static DisposeManager getInstance(){
|
|
20 return instance;
|
|
21 }
|
355
|
22
|
417
|
23 public <T> void setCodeSegment(String managerKey, Class<T> clazz){
|
|
24 CtClass cs = null;
|
|
25 String metaName = "Meta"+clazz.getSimpleName();
|
|
26 try {
|
|
27 // if cannot get mataName Class go catch NotFoundException
|
|
28 cs = cp.get(metaName);
|
|
29 // already created
|
|
30 Class<?> metaClazz = cp.getClassLoader().loadClass(metaName);
|
|
31 metaClazz.newInstance();
|
|
32 } catch (ClassNotFoundException e) {
|
|
33 System.out.println("ClassLoder loadClass error");
|
|
34 e.printStackTrace();
|
|
35 } catch (InstantiationException e) {
|
|
36 System.out.println("newInstance() error");
|
|
37 } catch (IllegalAccessException e) {
|
|
38 System.out.println("newInstance() error");
|
|
39 } catch (NotFoundException e) {
|
|
40 try {
|
|
41 CtClass parent = cp.get(clazz.getName());
|
|
42
|
|
43 // check super class is CS
|
|
44 boolean checkSuperClass = parent.getSuperclass().getSimpleName().equals("CodeSegment");
|
|
45 if (!checkSuperClass) {
|
|
46 // argument wrong
|
|
47 return;
|
|
48 } else {
|
|
49
|
|
50 // create Meta Code Segment
|
|
51 cs = cp.makeClass("Meta"+clazz.getSimpleName());
|
|
52 parent.getClassFile().setAccessFlags(AccessFlag.ABSTRACT);
|
|
53 parent.setName("Abstract"+parent.getSimpleName());
|
|
54 cs.setSuperclass(parent);
|
|
55
|
|
56 // define meta inputDataSegment
|
|
57 CtClass receiver = cp.get("alice.datasegment.Receiver");
|
412
|
58
|
417
|
59 // need check exist name
|
|
60 String metaFieldName = "metaInfo";
|
|
61
|
|
62 CtField cf = new CtField(receiver ,metaFieldName, parent);
|
|
63 parent.addField(cf, "ids.create(alice.datasegment.CommandType.PEEK)");
|
|
64
|
|
65 cf.getFieldInfo().setAccessFlags(AccessFlag.PUBLIC);
|
|
66 for (CtField f : parent.getFields()){
|
|
67 int accessType = f.getFieldInfo().getAccessFlags();
|
|
68 if (accessType != AccessFlag.PUBLIC){
|
|
69 f.getFieldInfo().setAccessFlags(AccessFlag.PUBLIC);
|
|
70 }
|
|
71 }
|
|
72
|
|
73 CtMethod runMethod = parent.getMethod("run", "()V");
|
|
74 CtMethod copy = CtNewMethod.copy(runMethod, cs, null);
|
|
75 runMethod.setName("metaRun");
|
|
76 System.out.println(copy.getName());
|
|
77 cs.addMethod(copy);
|
412
|
78
|
417
|
79 String cnst = "public "+metaName+"(){"
|
|
80 + metaFieldName+".setKey(\"TEST\");"
|
|
81 + "}";
|
|
82
|
|
83 cs.addConstructor(CtNewConstructor.make(cnst, cs));
|
|
84
|
|
85 parent.toClass();
|
|
86 Class<?> metaClass = cs.toClass();
|
|
87 metaClass.newInstance();
|
|
88 }
|
|
89 } catch (NotFoundException e1) {
|
|
90 System.out.println("not found super Class");
|
|
91 return;
|
|
92 } catch (CannotCompileException e1) {
|
|
93 e1.printStackTrace();
|
|
94 } catch (InstantiationException e1) {
|
|
95 e1.printStackTrace();
|
|
96 } catch (IllegalAccessException e1) {
|
|
97 e1.printStackTrace();
|
|
98 }
|
|
99 }
|
|
100
|
|
101 }
|
355
|
102 }
|