Mercurial > hg > Database > Alice
diff 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 |
line wrap: on
line diff
--- a/src/main/java/alice/test/reflection/DisposeManager.java Wed Jul 09 03:45:14 2014 +0900 +++ b/src/main/java/alice/test/reflection/DisposeManager.java Tue Jul 15 00:06:10 2014 +0900 @@ -4,77 +4,99 @@ import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; +import javassist.CtMethod; import javassist.CtNewConstructor; +import javassist.CtNewMethod; import javassist.NotFoundException; +import javassist.bytecode.AccessFlag; public class DisposeManager { - private static DisposeManager instance = new DisposeManager(); - private ClassPool cp = ClassPool.getDefault(); + private static DisposeManager instance = new DisposeManager(); + private ClassPool cp = ClassPool.getDefault(); - private DisposeManager(){} + private DisposeManager(){} - public static DisposeManager getInstance(){ - return instance; - } + public static DisposeManager getInstance(){ + return instance; + } - public <T> void setCodeSegment(String managerKey, Class<T> clazz){ - CtClass cs = null; - String metaName = "Meta"+clazz.getSimpleName(); - try { - // if cannot get mataName Class go catch NotFoundException - cs = cp.get(metaName); - // already created - Class<?> metaClazz = cp.getClassLoader().loadClass(metaName); - metaClazz.newInstance(); - } catch (ClassNotFoundException e) { - System.out.println("ClassLoder loadClass error"); - e.printStackTrace(); - } catch (InstantiationException e) { - System.out.println("newInstance() error"); - } catch (IllegalAccessException e) { - System.out.println("newInstance() error"); - } catch (NotFoundException e) { - try { - CtClass parent = cp.get(clazz.getName()); + public <T> void setCodeSegment(String managerKey, Class<T> clazz){ + CtClass cs = null; + String metaName = "Meta"+clazz.getSimpleName(); + try { + // if cannot get mataName Class go catch NotFoundException + cs = cp.get(metaName); + // already created + Class<?> metaClazz = cp.getClassLoader().loadClass(metaName); + metaClazz.newInstance(); + } catch (ClassNotFoundException e) { + System.out.println("ClassLoder loadClass error"); + e.printStackTrace(); + } catch (InstantiationException e) { + System.out.println("newInstance() error"); + } catch (IllegalAccessException e) { + System.out.println("newInstance() error"); + } catch (NotFoundException e) { + try { + CtClass parent = cp.get(clazz.getName()); + + // check super class is CS + boolean checkSuperClass = parent.getSuperclass().getSimpleName().equals("CodeSegment"); + if (!checkSuperClass) { + // argument wrong + return; + } else { + + // create Meta Code Segment + cs = cp.makeClass("Meta"+clazz.getSimpleName()); + parent.getClassFile().setAccessFlags(AccessFlag.ABSTRACT); + parent.setName("Abstract"+parent.getSimpleName()); + cs.setSuperclass(parent); + + // define meta inputDataSegment + CtClass receiver = cp.get("alice.datasegment.Receiver"); - // check super class is CS - boolean checkSuperClass = parent.getSuperclass().getSimpleName().equals("CodeSegment"); - if (!checkSuperClass) { - // argument wrong - return; - } else { - cs = cp.makeClass("Meta"+clazz.getSimpleName()); - cs.setSuperclass(parent); - - // define meta inputDataSegment - CtClass receiver = cp.get("alice.datasegment.Receiver"); - - // need check exist name - String metaFieldName = "metaInfo"; - - CtField cf = new CtField(receiver ,metaFieldName, cs); - cs.addField(cf, "ids.create(alice.datasegment.CommandType.PEEK)"); - - String cnst = "public "+metaName+"(){" - + metaFieldName+".setKey(\"TEST\");" - + "}"; - - cs.addConstructor(CtNewConstructor.make(cnst, cs)); - - Class<?> metaClass = cs.toClass(); - metaClass.newInstance(); - } - } catch (NotFoundException e1) { - System.out.println("not found super Class"); - return; - } catch (CannotCompileException e1) { - e1.printStackTrace(); - } catch (InstantiationException e1) { - e1.printStackTrace(); - } catch (IllegalAccessException e1) { - e1.printStackTrace(); - } - } + // need check exist name + String metaFieldName = "metaInfo"; + + CtField cf = new CtField(receiver ,metaFieldName, parent); + parent.addField(cf, "ids.create(alice.datasegment.CommandType.PEEK)"); + + cf.getFieldInfo().setAccessFlags(AccessFlag.PUBLIC); + for (CtField f : parent.getFields()){ + int accessType = f.getFieldInfo().getAccessFlags(); + if (accessType != AccessFlag.PUBLIC){ + f.getFieldInfo().setAccessFlags(AccessFlag.PUBLIC); + } + } + + CtMethod runMethod = parent.getMethod("run", "()V"); + CtMethod copy = CtNewMethod.copy(runMethod, cs, null); + runMethod.setName("metaRun"); + System.out.println(copy.getName()); + cs.addMethod(copy); - } + String cnst = "public "+metaName+"(){" + + metaFieldName+".setKey(\"TEST\");" + + "}"; + + cs.addConstructor(CtNewConstructor.make(cnst, cs)); + + parent.toClass(); + Class<?> metaClass = cs.toClass(); + metaClass.newInstance(); + } + } catch (NotFoundException e1) { + System.out.println("not found super Class"); + return; + } catch (CannotCompileException e1) { + e1.printStackTrace(); + } catch (InstantiationException e1) { + e1.printStackTrace(); + } catch (IllegalAccessException e1) { + e1.printStackTrace(); + } + } + + } }