change the part for creating a new constructor within DynamicCodeGenerator

This commit is contained in:
Muga Nishizawa 2010-08-26 17:53:29 +09:00
parent 18c712cd99
commit ff0e1bbbc0

View File

@ -29,6 +29,8 @@ public class DynamicCodeGenerator {
private static final String PACKER_CLASS_TYPE_NAME = Packer.class.getName(); private static final String PACKER_CLASS_TYPE_NAME = Packer.class.getName();
private static final String VOID_TYPE_NAME = "void";
private static final String PACKER_OBJECT_NAME = "pk"; private static final String PACKER_OBJECT_NAME = "pk";
private static final String UNPACKER_CLASS_TYPE_NAME = Unpacker.class private static final String UNPACKER_CLASS_TYPE_NAME = Unpacker.class
@ -37,7 +39,7 @@ public class DynamicCodeGenerator {
private static final String UNPACKER_OBJECT_NAME = "pk"; private static final String UNPACKER_OBJECT_NAME = "pk";
private HashMap<String, Class<?>> classMap; private HashMap<String, Class<?>> classMap;
private HashMap<String, Object> objectCacheMap; private HashMap<String, Object> objectCacheMap;
private ClassPool pool; private ClassPool pool;
@ -50,23 +52,23 @@ public class DynamicCodeGenerator {
public Object newEnhancedInstance(Class<?> targetClass) throws Exception { public Object newEnhancedInstance(Class<?> targetClass) throws Exception {
String targetClassName = targetClass.getName(); String targetClassName = targetClass.getName();
//Class<?> enhancedClass = classMap.get(targetClassName); // Class<?> enhancedClass = classMap.get(targetClassName);
Object enhancedObject = objectCacheMap.get(targetClassName); Object enhancedObject = objectCacheMap.get(targetClassName);
//if (enhancedClass == null) { // if (enhancedClass == null) {
if (enhancedObject == null) { if (enhancedObject == null) {
CtClass enhancedCtClass = createEnhancedCtClass(targetClassName); CtClass enhancedCtClass = createEnhancedCtClass(targetClassName);
// System.out.println("enhanced class name: " // System.out.println("enhanced class name: "
// + enhancedCtClass.getName()); // + enhancedCtClass.getName());
addSuperclass(enhancedCtClass, targetClassName); addSuperclass(enhancedCtClass, targetClassName);
addConstructor(enhancedCtClass); addConstructor(enhancedCtClass);
createMessagePackMethod(enhancedCtClass, targetClass); createMessagePackMethod(enhancedCtClass, targetClass);
createMessageUnpackMethod(enhancedCtClass, targetClass); createMessageUnpackMethod(enhancedCtClass, targetClass);
Class enhancedClass = loadEnhancedClass(enhancedCtClass); Class enhancedClass = loadEnhancedClass(enhancedCtClass);
//classMap.put(targetClassName, enhancedClass); // classMap.put(targetClassName, enhancedClass);
enhancedObject = enhancedClass.newInstance(); enhancedObject = enhancedClass.newInstance();
objectCacheMap.put(targetClassName, enhancedObject); objectCacheMap.put(targetClassName, enhancedObject);
} }
//return newEnhancedInstance0(enhancedClass); // return newEnhancedInstance0(enhancedClass);
return enhancedObject; return enhancedObject;
} }
@ -82,24 +84,18 @@ public class DynamicCodeGenerator {
} }
private void addConstructor(CtClass enhancedCtClass) throws Exception { private void addConstructor(CtClass enhancedCtClass) throws Exception {
StringBuilder sb = new StringBuilder(); CtConstructor newCtConstructor = CtNewConstructor
sb.append(MODIFIER_PUBLIC).append(SPACE).append( .defaultConstructor(enhancedCtClass);
// enhancedCtClass.getName()).append("(").append(")")
"Image3_$$_Enhanced").append("(").append(")").append(SPACE)
.append("{ super(); }"); // TODO
// System.out.println("cons: " + sb.toString());
CtConstructor newCtConstructor = CtNewConstructor.make(sb.toString(),
enhancedCtClass);
enhancedCtClass.addConstructor(newCtConstructor); enhancedCtClass.addConstructor(newCtConstructor);
} }
private void createMessagePackMethod(CtClass enhancedCtClass, private void createMessagePackMethod(CtClass enhancedCtClass,
Class<?> targetClass) throws Exception { Class<?> targetClass) throws Exception {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
sb.append(MODIFIER_PUBLIC).append(SPACE).append("void").append(SPACE) sb.append(MODIFIER_PUBLIC).append(SPACE).append(VOID_TYPE_NAME).append(
.append(METHOD_NAME_MESSAGEPACK).append("(").append( SPACE).append(METHOD_NAME_MESSAGEPACK).append("(").append(
PACKER_CLASS_TYPE_NAME).append(SPACE).append( PACKER_CLASS_TYPE_NAME).append(SPACE)
PACKER_OBJECT_NAME).append(")").append(SPACE).append( .append(PACKER_OBJECT_NAME).append(")").append(SPACE).append(
"throws").append(SPACE).append("java.io.IOException") "throws").append(SPACE).append("java.io.IOException")
.append(SPACE).append("{"); .append(SPACE).append("{");
Field[] fields = targetClass.getFields(); Field[] fields = targetClass.getFields();
@ -109,7 +105,7 @@ public class DynamicCodeGenerator {
insertCodeOfMessagePack(field, sb); insertCodeOfMessagePack(field, sb);
} }
sb.append("}"); sb.append("}");
// System.out.println("messagePack method: " + sb.toString()); // System.out.println("messagePack method: " + sb.toString());
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), enhancedCtClass); CtMethod newCtMethod = CtNewMethod.make(sb.toString(), enhancedCtClass);
enhancedCtClass.addMethod(newCtMethod); enhancedCtClass.addMethod(newCtMethod);
} }
@ -135,7 +131,7 @@ public class DynamicCodeGenerator {
sb sb
.append(MODIFIER_PUBLIC) .append(MODIFIER_PUBLIC)
.append(SPACE) .append(SPACE)
.append("void") .append(VOID_TYPE_NAME)
.append(SPACE) .append(SPACE)
.append(METHOD_NAME_MESSAGEUNPACK) .append(METHOD_NAME_MESSAGEUNPACK)
.append("(") .append("(")
@ -149,13 +145,14 @@ public class DynamicCodeGenerator {
.append("org.msgpack.MessageTypeException, java.io.IOException") .append("org.msgpack.MessageTypeException, java.io.IOException")
.append(SPACE).append("{"); .append(SPACE).append("{");
Field[] fields = targetClass.getFields(); Field[] fields = targetClass.getFields();
sb.append(UNPACKER_OBJECT_NAME).append(".").append("unpackArray()").append(";"); sb.append(UNPACKER_OBJECT_NAME).append(".").append("unpackArray()")
.append(";");
// TODO // TODO
for (Field field : fields) { for (Field field : fields) {
insertCodeOfMessageUnpack(field, sb); insertCodeOfMessageUnpack(field, sb);
} }
sb.append("}"); sb.append("}");
// System.out.println("messageUnpack method: " + sb.toString()); // System.out.println("messageUnpack method: " + sb.toString());
CtMethod newCtMethod = CtNewMethod.make(sb.toString(), enhancedCtClass); CtMethod newCtMethod = CtNewMethod.make(sb.toString(), enhancedCtClass);
enhancedCtClass.addMethod(newCtMethod); enhancedCtClass.addMethod(newCtMethod);
} }