baliuka 02/04/29 04:50:24 Modified: simplestore/src/java/org/apache/commons/simplestore/tools Enhancer.java Log: Fixed bug Revision Changes Path 1.21 +304 -291 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java Index: Enhancer.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/tools/Enhancer.java,v retrieving revision 1.20 retrieving revision 1.21 diff -u -r1.20 -r1.21 --- Enhancer.java 14 Apr 2002 19:43:45 -0000 1.20 +++ Enhancer.java 29 Apr 2002 11:50:24 -0000 1.21 @@ -102,59 +102,60 @@ import org.apache.bcel.generic.Type; import org.apache.bcel.generic.ArrayType; /** -* this code returns Enhanced Vector to intercept all methods for tracing -* <pre> -* java.util.Vector vector = (java.util.Vector)Enhancer.enhance( -* java.util.Vector.class, -* new Class[]{java.util.List.class}, -* -* new MethodInterceptor(){ -* -* public Object beforeInvoke( Object obj,java.lang.reflect.Method method, -* Object args[] ) -* throws java.lang.Throwable{ -* return null; -* } -* -* public boolean invokeSuper( Object obj,java.lang.reflect.Method method, -* Object args[], Object retValFromBefore ) -* throws java.lang.Throwable{ -* return true; -* } -* -* -* public Object afterReturn( Object obj, java.lang.reflect.Method method, -* Object args[], Object retValFromBefore, -* boolean invokedSuper, Object retValFromSuper, -* java.lang.Throwable e )throws java.lang.Throwable{ -* System.out.println(method); -* return retValFromSuper;//return the same as supper -* } -* -* }); -* </pre> -*@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]"> + * this code returns Enhanced Vector to intercept all methods for tracing + * <pre> + * java.util.Vector vector = (java.util.Vector)Enhancer.enhance( + * java.util.Vector.class, + * new Class[]{java.util.List.class}, + * + * new MethodInterceptor(){ + * + * public Object beforeInvoke( Object obj,java.lang.reflect.Method method, + * Object args[] ) + * throws java.lang.Throwable{ + * return null; + * } + * + * public boolean invokeSuper( Object obj,java.lang.reflect.Method method, + * Object args[], Object retValFromBefore ) + * throws java.lang.Throwable{ + * return true; + * } + * + * + * public Object afterReturn( Object obj, java.lang.reflect.Method method, + * Object args[], Object retValFromBefore, + * boolean invokedSuper, Object retValFromSuper, + * java.lang.Throwable e )throws java.lang.Throwable{ + * System.out.println(method); + * return retValFromSuper;//return the same as supper + * } + * + * }); + * </pre> + *@author Juozas Baliuka <a href="mailto:[EMAIL PROTECTED]"> * [EMAIL PROTECTED]</a> - *@version $Id: Enhancer.java,v 1.20 2002/04/14 19:43:45 baliuka Exp $ + *@version $Id: Enhancer.java,v 1.21 2002/04/29 11:50:24 baliuka Exp $ */ -public class Enhancer implements org.apache.bcel.Constants , Constants{ +public class Enhancer implements org.apache.bcel.Constants , +Constants{ + - static final String INTERCEPTOR_CLASS = MethodInterceptor.class.getName(); static final ObjectType BOOLEAN_OBJECT = - new ObjectType(Boolean.class.getName()); + new ObjectType(Boolean.class.getName()); static final ObjectType INTEGER_OBJECT = - new ObjectType(Integer.class.getName()); + new ObjectType(Integer.class.getName()); static final ObjectType CHARACTER_OBJECT = - new ObjectType(Character.class.getName()); + new ObjectType(Character.class.getName()); static final ObjectType BYTE_OBJECT = new ObjectType(Byte.class.getName()); static final ObjectType SHORT_OBJECT = new ObjectType(Short.class.getName()); static final ObjectType LONG_OBJECT = new ObjectType(Long.class.getName()); static final ObjectType DOUBLE_OBJECT = new ObjectType(Double.class.getName()); static final ObjectType FLOAT_OBJECT = new ObjectType(Float.class.getName()); static final ObjectType METHOD_OBJECT = - new ObjectType(java.lang.reflect.Method.class.getName()); + new ObjectType(java.lang.reflect.Method.class.getName()); static final ObjectType NUMBER_OBJECT = new ObjectType(Number.class.getName()); static final String CONSTRUCTOR_NAME = "<init>"; static final String FIELD_NAME = "h"; @@ -164,40 +165,40 @@ static int index = 0; private static int addAfterConstructionRef(ConstantPoolGen cp) { return cp.addMethodref( - Enhancer.class.getName(), - "handleConstruction", - "(Ljava/lang/Object;[Ljava/lang/Object;)V"); + Enhancer.class.getName(), + "handleConstruction", + "(Ljava/lang/Object;[Ljava/lang/Object;)V"); } private static int addAfterRef(ConstantPoolGen cp) { return cp.addInterfaceMethodref( - INTERCEPTOR_CLASS, - "afterReturn", - "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;"); + INTERCEPTOR_CLASS, + "afterReturn", + "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;ZLjava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;"); } private static int addInvokeSupperRef(ConstantPoolGen cp) { return cp.addInterfaceMethodref( - INTERCEPTOR_CLASS, - "invokeSuper", - "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z"); + INTERCEPTOR_CLASS, + "invokeSuper", + "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;Ljava/lang/Object;)Z"); } private static int addBeforeRef(ConstantPoolGen cp) { return cp.addInterfaceMethodref( - INTERCEPTOR_CLASS, - "beforeInvoke", - "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"); + INTERCEPTOR_CLASS, + "beforeInvoke", + "(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;"); } private static java.util.List costructionHandlers = new java.util.Vector(); private static java.util.Map cache = new java.util.WeakHashMap(); /** Creates a new instance of Enchancer */ protected Enhancer() {} public static void setMethodInterceptor(Object enhanced, MethodInterceptor ih) - throws Throwable { + throws Throwable { enhanced.getClass().getField(FIELD_NAME).set(enhanced, ih); } public static MethodInterceptor getMethodInterceptor(Object enhanced) - throws Throwable { + throws Throwable { return (MethodInterceptor) enhanced.getClass().getField(FIELD_NAME).get( - enhanced); + enhanced); } public static void addConstructionHandler(ConstructionHandler ch) { costructionHandlers.add(ch); @@ -206,76 +207,88 @@ costructionHandlers.remove(ch); } public static synchronized void handleConstruction(Object obj, Object args[]) - throws Throwable { + throws Throwable { for (java.util.Iterator i = costructionHandlers.iterator(); i.hasNext();) { ((ConstructionHandler) i.next()).afterConstruction(obj, args); } } public static Object enhance( - Class cls, - Class interfaces[], - MethodInterceptor ih) - throws Throwable { + Class cls, + Class interfaces[], + MethodInterceptor ih) + throws Throwable { return enhance( - cls, - null, - interfaces, - ih, - Thread.currentThread().getContextClassLoader()); + cls, + interfaces, + ih, + Thread.currentThread().getContextClassLoader()); } public synchronized static Object enhance( - Class cls, - String class_name, - Class interfaces[], - MethodInterceptor ih, - ClassLoader loader) - throws Throwable { + Class cls, + /* String class_name, */ //it was not good idea + Class interfaces[], + MethodInterceptor ih, + ClassLoader loader) + throws Throwable { if (cls == null) { - cls = Enhancer.class; + cls = Object.class; } - if (class_name == null) { - class_name = cls.getName() + CLASS_SUFIX; - if (class_name.startsWith("java")) { - class_name = CLASS_PREFIX + class_name; + + StringBuffer key = new StringBuffer(cls.getName() + ";"); + if(interfaces != null){ + for(int i = 0; i< interfaces.length; i++ ){ + key.append(interfaces[i].getName()); } - if( cls == Enhancer.class ) - class_name += index; } + + java.util.Map map = (java.util.Map) cache.get(loader); if ( map == null ) { map = new java.util.HashMap(); cache.put(loader, map); } - Class result = (Class) map.get(class_name); + + Class result = (Class) map.get(key); + + + if (result == null) { + + String class_name = cls.getName() + CLASS_SUFIX; + if (class_name.startsWith("java")) { + class_name = CLASS_PREFIX + class_name; + } + class_name += index++; + + java.util.HashMap methods = new java.util.HashMap(); JavaClass clazz = enhance(cls, class_name, interfaces, methods); byte b[] = clazz.getBytes(); java.lang.reflect.Method m = - ClassLoader.class.getDeclaredMethod( - "defineClass", - new Class[] { String.class, byte[].class, int.class, int.class }); + ClassLoader.class.getDeclaredMethod( + "defineClass", + new Class[] { String.class, byte[].class, int.class, int.class }); // protected method invocaton boolean flag = m.isAccessible(); m.setAccessible(true); result = - (Class) m.invoke( - loader, - new Object[] { clazz.getClassName(), b, new Integer(0), new Integer(b.length)}); + (Class) m.invoke( + loader, + new Object[] { clazz.getClassName(), b, new Integer(0), new Integer(b.length)}); m.setAccessible(flag); for (java.util.Iterator i = methods.keySet().iterator(); i.hasNext();) { String name = (String) i.next(); result.getField(name).set(null, methods.get(name)); } - map.put(class_name, result); + map.put(key, result); } return result - .getConstructor( - new Class[] { Class.forName(MethodInterceptor.class.getName(), true, loader)}) - .newInstance(new Object[] { ih }); + .getConstructor( + new Class[] { Class.forName(MethodInterceptor.class.getName(), true, loader)}) + .newInstance(new Object[] { ih }); } private static void addConstructors(ClassGen cg, Class superClass) - throws Throwable { + throws Throwable { addConstructor(cg); //default java.lang.reflect.Constructor constructors[] = superClass.getConstructors(); String parentClass = cg.getSuperclassName(); @@ -284,8 +297,8 @@ for (int i = 0; i < constructors.length; i++) { Class parmTypes[] = constructors[i].getParameterTypes(); if (parmTypes.length == 1 - && parmTypes[0].equals( - org.apache.commons.simplestore.tools.MethodInterceptor.class)) { + && parmTypes[0].equals( + org.apache.commons.simplestore.tools.MethodInterceptor.class)) { continue; } InstructionList il = new InstructionList(); @@ -296,11 +309,11 @@ il.append(new ASTORE(argArray)); il.append(new ALOAD(0)); il.append( - factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - GETFIELD)); + factory.createFieldAccess( + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + GETFIELD)); il.append(new ALOAD(0)); il.append(new ALOAD(argArray)); il.append(new INVOKESTATIC(addAfterConstructionRef(cp))); @@ -315,55 +328,55 @@ InstructionFactory factory = new InstructionFactory(cg); ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool InstructionList il = new InstructionList(); - MethodGen costructor = new MethodGen(ACC_PUBLIC, // access flags + MethodGen costructor = new MethodGen(ACC_PUBLIC, // access flags Type.VOID, // return type - new Type[] { // argument types + new Type[] { // argument types new ObjectType(INTERCEPTOR_CLASS)}, null, // arg names - CONSTRUCTOR_NAME, cg.getClassName(), il, cp); - il.append(new ALOAD(0)); - il.append( + CONSTRUCTOR_NAME, cg.getClassName(), il, cp); + il.append(new ALOAD(0)); + il.append( factory.createInvoke( - parentClass, - CONSTRUCTOR_NAME, - Type.VOID, - new Type[] {}, - INVOKESPECIAL)); - il.append(new ALOAD(0)); - il.append(new ALOAD(1)); - il.append( + parentClass, + CONSTRUCTOR_NAME, + Type.VOID, + new Type[] {}, + INVOKESPECIAL)); + il.append(new ALOAD(0)); + il.append(new ALOAD(1)); + il.append( factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - PUTFIELD)); - Type argTypes[] = new Type[] { new ObjectType(INTERCEPTOR_CLASS)}; - int argArray = createArgArray(il, factory, cp, argTypes); - il.append(new ASTORE(argArray)); - il.append(new ALOAD(0)); - il.append( + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + PUTFIELD)); + Type argTypes[] = new Type[] { new ObjectType(INTERCEPTOR_CLASS)}; + int argArray = createArgArray(il, factory, cp, argTypes); + il.append(new ASTORE(argArray)); + il.append(new ALOAD(0)); + il.append( factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - GETFIELD)); - il.append(new ALOAD(0)); - il.append(new ALOAD(argArray)); - il.append(new INVOKESTATIC(addAfterConstructionRef(cp))); - il.append(new RETURN()); - cg.addMethod(getMethod(costructor)); + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + GETFIELD)); + il.append(new ALOAD(0)); + il.append(new ALOAD(argArray)); + il.append(new INVOKESTATIC(addAfterConstructionRef(cp))); + il.append(new RETURN()); + cg.addMethod(getMethod(costructor)); } private static void addHandlerField(ClassGen cg) { ConstantPoolGen cp = cg.getConstantPool(); FieldGen fg = - new FieldGen(ACC_PUBLIC, new ObjectType(INTERCEPTOR_CLASS), FIELD_NAME, cp); + new FieldGen(ACC_PUBLIC, new ObjectType(INTERCEPTOR_CLASS), FIELD_NAME, cp); cg.addField(fg.getField()); } private static ClassGen getClassGen( - String class_name, - Class parentClass, - Class[] interfaces) { + String class_name, + Class parentClass, + Class[] interfaces) { ClassGen gen = - new ClassGen(class_name, parentClass.getName(), SOURCE_FILE, ACC_PUBLIC, null); + new ClassGen(class_name, parentClass.getName(), SOURCE_FILE, ACC_PUBLIC, null); if (interfaces != null) { for (int i = 0; i < interfaces.length; i++) { gen.addInterface(interfaces[i].getName()); @@ -372,11 +385,11 @@ return gen; } private static JavaClass enhance( - Class parentClass, - String class_name, - Class interfaces[], - java.util.HashMap methodTable) - throws Throwable { + Class parentClass, + String class_name, + Class interfaces[], + java.util.HashMap methodTable) + throws Throwable { ClassGen cg = getClassGen(class_name, parentClass, interfaces); ConstantPoolGen cp = cg.getConstantPool(); // cg creates constant pool addHandlerField(cg); @@ -396,13 +409,13 @@ for (int i = 0; i < methods.length; i++) { int mod = methods[i].getModifiers(); if (!java.lang.reflect.Modifier.isStatic(mod) - && !java.lang.reflect.Modifier.isFinal(mod) - && (java.lang.reflect.Modifier.isPublic(mod) - || java.lang.reflect.Modifier.isProtected(mod))) { - + && !java.lang.reflect.Modifier.isFinal(mod) + && (java.lang.reflect.Modifier.isPublic(mod) + || java.lang.reflect.Modifier.isProtected(mod))) { + methodSet.add(new MethodWrapper(methods[i])); if( DEBUG ){ - System.out.println("added:" + methods[i]); + System.out.println("added:" + methods[i]); } } } @@ -420,14 +433,14 @@ private static void addMethodField(String fieldName, ClassGen cg) { ConstantPoolGen cp = cg.getConstantPool(); FieldGen fg = - new FieldGen(ACC_PUBLIC | ACC_STATIC, METHOD_OBJECT, fieldName, cp); + new FieldGen(ACC_PUBLIC | ACC_STATIC, METHOD_OBJECT, fieldName, cp); cg.addField(fg.getField()); } private static int createArgArray( - InstructionList il, - InstructionFactory factory, - ConstantPoolGen cp, - Type[] args) { + InstructionList il, + InstructionFactory factory, + ConstantPoolGen cp, + Type[] args) { int argCount = args.length; if (argCount > 5) il.append(new BIPUSH((byte) argCount)); @@ -447,59 +460,59 @@ il.append(new DUP()); il.append(new ILOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V"))); + new INVOKESPECIAL( + cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V"))); } else if (args[i].equals(Type.INT)) { il.append(new NEW(cp.addClass(INTEGER_OBJECT))); il.append(new DUP()); il.append(new ILOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V"))); + new INVOKESPECIAL( + cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V"))); } else if (args[i].equals(Type.CHAR)) { il.append(new NEW(cp.addClass(CHARACTER_OBJECT))); il.append(new DUP()); il.append(new ILOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V"))); + new INVOKESPECIAL( + cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V"))); } else if (args[i].equals(Type.BYTE)) { il.append(new NEW(cp.addClass(BYTE_OBJECT))); il.append(new DUP()); il.append(new ILOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V"))); + new INVOKESPECIAL( + cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V"))); } else if (args[i].equals(Type.SHORT)) { il.append(new NEW(cp.addClass(SHORT_OBJECT))); il.append(new DUP()); il.append(new ILOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V"))); + new INVOKESPECIAL( + cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V"))); } else if (args[i].equals(Type.LONG)) { il.append(new NEW(cp.addClass(LONG_OBJECT))); il.append(new DUP()); il.append(new LLOAD(load)); load += 2; il.append( - new INVOKESPECIAL( - cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V"))); + new INVOKESPECIAL( + cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V"))); } else if (args[i].equals(Type.DOUBLE)) { il.append(new NEW(cp.addClass(DOUBLE_OBJECT))); il.append(new DUP()); il.append(new DLOAD(load)); load += 2; il.append( - new INVOKESPECIAL( - cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V"))); + new INVOKESPECIAL( + cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V"))); } else if (args[i].equals(Type.FLOAT)) { il.append(new NEW(cp.addClass(FLOAT_OBJECT))); il.append(new DUP()); il.append(new FLOAD(load++)); il.append( - new INVOKESPECIAL( - cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V"))); + new INVOKESPECIAL( + cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V"))); } il.append(new AASTORE()); } else { @@ -516,11 +529,11 @@ return mg.getMethod(); } private static InstructionHandle generateReturnValue( - InstructionList il, - InstructionFactory factory, - ConstantPoolGen cp, - Type returnType, - int stack) { + InstructionList il, + InstructionFactory factory, + ConstantPoolGen cp, + Type returnType, + int stack) { if (returnType.equals(Type.VOID)) { return il.append(new RETURN()); } @@ -528,108 +541,108 @@ il.append(new ALOAD(stack)); if ((returnType instanceof ObjectType) || ( returnType instanceof ArrayType) ) { if (returnType instanceof ArrayType){ - il.append(new CHECKCAST(cp.addArrayClass((ArrayType)returnType))); - return il.append(new ARETURN()); + il.append(new CHECKCAST(cp.addArrayClass((ArrayType)returnType))); + return il.append(new ARETURN()); } if (!returnType.equals(Type.OBJECT)){ - il.append(new CHECKCAST(cp.addClass((ObjectType) returnType))); - return il.append(new ARETURN()); + il.append(new CHECKCAST(cp.addClass((ObjectType) returnType))); + return il.append(new ARETURN()); }else { - return il.append(new ARETURN()); + return il.append(new ARETURN()); } - } + } if (returnType instanceof BasicType) { if (returnType.equals(Type.BOOLEAN)) { IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new ICONST(0) ); - il.append(new IRETURN()); + il.append(new IRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); il.append(new CHECKCAST(cp.addClass(BOOLEAN_OBJECT))); il.append( - factory.createInvoke( - Boolean.class.getName(), - "booleanValue", - Type.BOOLEAN, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + Boolean.class.getName(), + "booleanValue", + Type.BOOLEAN, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new IRETURN()); } else if (returnType.equals(Type.CHAR)) { - IFNONNULL ifNNull = new IFNONNULL(null); + IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new ICONST(0) ); - il.append(new IRETURN()); + il.append(new IRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); il.append(new CHECKCAST(cp.addClass(CHARACTER_OBJECT))); il.append( - factory.createInvoke( - Character.class.getName(), - "charValue", - Type.CHAR, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + Character.class.getName(), + "charValue", + Type.CHAR, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new IRETURN()); } else if (returnType.equals(Type.LONG)) { IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new LCONST(0) ); - il.append(new LRETURN()); + il.append(new LRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT))); il.append( - factory.createInvoke( - Number.class.getName(), - "longValue", - Type.LONG, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + Number.class.getName(), + "longValue", + Type.LONG, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new LRETURN()); } else if (returnType.equals(Type.DOUBLE)) { IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new DCONST(0) ); - il.append(new DRETURN()); + il.append(new DRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); - + il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT))); il.append( - factory.createInvoke( - Number.class.getName(), - "doubleValue", - Type.DOUBLE, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + Number.class.getName(), + "doubleValue", + Type.DOUBLE, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new DRETURN()); } else if (returnType.equals(Type.FLOAT)) { IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new FCONST(0) ); - il.append(new FRETURN()); + il.append(new FRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT))); il.append( - factory.createInvoke( - java.lang.Number.class.getName(), - "floatValue", - Type.FLOAT, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + java.lang.Number.class.getName(), + "floatValue", + Type.FLOAT, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new FRETURN()); } else { IFNONNULL ifNNull = new IFNONNULL(null); il.append(ifNNull); il.append(new ICONST(0) ); - il.append(new IRETURN()); + il.append(new IRETURN()); ifNNull.setTarget(il.append(new ALOAD(stack))); il.append(new CHECKCAST(cp.addClass(NUMBER_OBJECT))); il.append( - factory.createInvoke( - Number.class.getName(), - "intValue", - Type.INT, - new Type[] {}, - INVOKEVIRTUAL)); + factory.createInvoke( + Number.class.getName(), + "intValue", + Type.INT, + new Type[] {}, + INVOKEVIRTUAL)); return il.append(new IRETURN()); } } @@ -661,28 +674,28 @@ if (type instanceof BasicType) { if (type.equals(Type.BOOLEAN)) { return new INVOKESPECIAL( - cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V")); + cp.addMethodref(Boolean.class.getName(), CONSTRUCTOR_NAME, "(Z)V")); } else if (type.equals(Type.INT)) { return new INVOKESPECIAL( - cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V")); + cp.addMethodref(Integer.class.getName(), CONSTRUCTOR_NAME, "(I)V")); } else if (type.equals(Type.CHAR)) { return new INVOKESPECIAL( - cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V")); + cp.addMethodref(Character.class.getName(), CONSTRUCTOR_NAME, "(C)V")); } else if (type.equals(Type.BYTE)) { return new INVOKESPECIAL( - cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V")); + cp.addMethodref(Byte.class.getName(), CONSTRUCTOR_NAME, "(B)V")); } else if (type.equals(Type.SHORT)) { return new INVOKESPECIAL( - cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V")); + cp.addMethodref(Short.class.getName(), CONSTRUCTOR_NAME, "(S)V")); } else if (type.equals(Type.LONG)) { return new INVOKESPECIAL( - cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V")); + cp.addMethodref(Long.class.getName(), CONSTRUCTOR_NAME, "(J)V")); } else if (type.equals(Type.DOUBLE)) { return new INVOKESPECIAL( - cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V")); + cp.addMethodref(Double.class.getName(), CONSTRUCTOR_NAME, "(D)V")); } else if (type.equals(Type.FLOAT)) { return new INVOKESPECIAL( - cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V")); + cp.addMethodref(Float.class.getName(), CONSTRUCTOR_NAME, "(F)V")); } } return null; @@ -739,7 +752,7 @@ return Type.BOOLEAN; } } else if (cls.isArray()) { - return new ArrayType( toType(cls.getComponentType()),cls.getName().lastIndexOf('[') + 1); + return new ArrayType( toType(cls.getComponentType()),cls.getName().lastIndexOf('[') + 1); } else return new ObjectType(cls.getName()); throw new java.lang.InternalError(cls.getName()); @@ -753,47 +766,47 @@ pos = loadArg(il, args[i], i, pos); } il.append( - new INVOKESPECIAL( - cp.addMethodref(cg.getSuperclassName(), mg.getName(), mg.getSignature()))); + new INVOKESPECIAL( + cp.addMethodref(cg.getSuperclassName(), mg.getName(), mg.getSignature()))); } private static MethodGen toMethodGen( - java.lang.reflect.Method mtd, - String className, - InstructionList il, - ConstantPoolGen cp) { + java.lang.reflect.Method mtd, + String className, + InstructionList il, + ConstantPoolGen cp) { return new MethodGen( - ACC_PUBLIC, - toType(mtd.getReturnType()), - toType(mtd.getParameterTypes()), - null, - mtd.getName(), - className, - il, - cp); + ACC_PUBLIC, + toType(mtd.getReturnType()), + toType(mtd.getParameterTypes()), + null, + mtd.getName(), + className, + il, + cp); } private static MethodGen toMethodGen( - java.lang.reflect.Constructor mtd, - String className, - InstructionList il, - ConstantPoolGen cp) { + java.lang.reflect.Constructor mtd, + String className, + InstructionList il, + ConstantPoolGen cp) { return new MethodGen( - ACC_PUBLIC, - Type.VOID, - toType(mtd.getParameterTypes()), - null, - CONSTRUCTOR_NAME, - className, - il, - cp); + ACC_PUBLIC, + Type.VOID, + toType(mtd.getParameterTypes()), + null, + CONSTRUCTOR_NAME, + className, + il, + cp); } private static Method generateMethod( - java.lang.reflect.Method method, - String fieldName, - ClassGen cg, - int before, - int after, - int invokeSuper) { - + java.lang.reflect.Method method, + String fieldName, + ClassGen cg, + int before, + int after, + int invokeSuper) { + InstructionList il = new InstructionList(); InstructionFactory factory = new InstructionFactory(cg); ConstantPoolGen cp = cg.getConstantPool(); @@ -804,7 +817,7 @@ addMethodField(fieldName, cg); boolean returnsValue = !mg.getReturnType().equals(Type.VOID); boolean abstractM = - java.lang.reflect.Modifier.isAbstract(method.getModifiers()); + java.lang.reflect.Modifier.isAbstract(method.getModifiers()); InstructionHandle ehEnd = null; GOTO gotoHandled = null; IFEQ ifInvoke = null; @@ -819,11 +832,11 @@ if (!abstractM) { // invoke before il.append(new ALOAD(0)); il.append( - factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - GETFIELD)); + factory.createFieldAccess( + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + GETFIELD)); il.append(new ALOAD(0)); il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT)); il.append(new ALOAD(argArray)); @@ -846,11 +859,11 @@ if (!abstractM) { //test before invoke super il.append(new ALOAD(0)); //this.handler il.append( - factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - GETFIELD)); + factory.createFieldAccess( + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + GETFIELD)); il.append(new ALOAD(0)); //this il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT)); il.append(new ALOAD(argArray)); @@ -888,11 +901,11 @@ gotoHandled.setTarget(endif); } il.append( - factory.createFieldAccess( - cg.getClassName(), - FIELD_NAME, - new ObjectType(INTERCEPTOR_CLASS), - GETFIELD)); + factory.createFieldAccess( + cg.getClassName(), + FIELD_NAME, + new ObjectType(INTERCEPTOR_CLASS), + GETFIELD)); il.append(new ALOAD(0)); //this il.append(factory.createGetStatic(cg.getClassName(), fieldName, METHOD_OBJECT)); il.append(new ALOAD(argArray)); @@ -902,7 +915,7 @@ il.append(new ALOAD(error)); il.append(new INVOKEINTERFACE(after, 8)); InstructionHandle exitMethod = - generateReturnValue(il, factory, cp, mg.getReturnType(), ++loaded); + generateReturnValue(il, factory, cp, mg.getReturnType(), ++loaded); if (!abstractM) { mg.addExceptionHandler(ehStart, ehEnd, ehHandled, Type.THROWABLE); } @@ -934,10 +947,10 @@ } } - public static boolean equals( - java.lang.reflect.Method m1, - java.lang.reflect.Method m2) { - + public static boolean equals( + java.lang.reflect.Method m1, + java.lang.reflect.Method m2) { + if (m1 == m2) { return true; @@ -948,21 +961,21 @@ if (params1.length == params2.length) { for (int i = 0; i < params1.length; i++) { if (!params1[i].getName().equals( params2[i].getName() ) ) { - return false; + return false; } } - - if(!m1.getReturnType().getName(). - equals(m2.getReturnType().getName()) ){ - throw new java.lang.IllegalStateException( - "Can't implement:\n" + m1.getDeclaringClass().getName() + - "\n and\n" + m2.getDeclaringClass().getName() + "\n"+ - m1.toString() + "\n" + m2.toString()); - } + + if(!m1.getReturnType().getName(). + equals(m2.getReturnType().getName()) ){ + throw new java.lang.IllegalStateException( + "Can't implement:\n" + m1.getDeclaringClass().getName() + + "\n and\n" + m2.getDeclaringClass().getName() + "\n"+ + m1.toString() + "\n" + m2.toString()); + } return true; } } - + return false; } }
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>