annotate src/main/java/alice/test/reflection/DisposeManager.java @ 417:aadea6a59376 dispose

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