view src/main/java/alice/daemon/dispose/DisposeManager.java @ 412:c9dd5ca304fc dispose

reflection test
author sugi
date Mon, 07 Jul 2014 16:20:33 +0900
parents 5215b3d9fb0f
children
line wrap: on
line source

package alice.daemon.dispose;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtField;
import javassist.CtNewConstructor;
import javassist.NotFoundException;

public class DisposeManager {
	private static DisposeManager instance = new DisposeManager(); 
	private ClassPool cp = ClassPool.getDefault();

	private DisposeManager(){}

	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());

				// 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();
			}
		}

	}
}