Browse Source

fixed Issue #263

tags/rel_3_26_0_ga
chibash 4 years ago
parent
commit
8f4788e090

BIN
javassist.jar View File


+ 37
- 0
src/main/javassist/util/proxy/ProxyFactory.java View File

import javassist.bytecode.FieldInfo; import javassist.bytecode.FieldInfo;
import javassist.bytecode.MethodInfo; import javassist.bytecode.MethodInfo;
import javassist.bytecode.Opcode; import javassist.bytecode.Opcode;
import javassist.bytecode.SignatureAttribute;
import javassist.bytecode.StackMapTable; import javassist.bytecode.StackMapTable;


/* /*
private String basename; private String basename;
private String superName; private String superName;
private Class<?> thisClass; private Class<?> thisClass;
private String genericSignature;

/** /**
* per factory setting initialised from current setting for useCache but able to be reset before each create call * per factory setting initialised from current setting for useCache but able to be reset before each create call
*/ */
signatureMethods = null; signatureMethods = null;
hasGetHandler = false; hasGetHandler = false;
thisClass = null; thisClass = null;
genericSignature = null;
writeDirectory = null; writeDirectory = null;
factoryUseCache = useCache; factoryUseCache = useCache;
factoryWriteReplace = useWriteReplace; factoryWriteReplace = useWriteReplace;
signature = null; signature = null;
} }


/**
* Sets the generic signature for the proxy class.
* <p>For example,
*
* <pre>class NullPtr&lt;T&gt; {
* T get() { return null; }
* }
* </pre>
*
* <p>The following code makes a proxy for <code>NullPtr&lt;String&gt;</code>:
*
* <pre>ProxyFactory factory = new ProxyFactory();
* factory.setSuperclass(NullPtr.class);
* factory.setGenericSignature("LNullPtr&lt;Ljava/lang/String;&gt;;");
* NullPtr&lt;?&gt; np = (NullPtr&lt;?&gt;)factory.create(null, null);
*java.lang.reflect.Type[] x = ((java.lang.reflect.ParameterizedType)np.getClass().getGenericSuperclass())
* .getActualTypeArguments();
* // x[0] == String.class
* </pre>
*
* @param sig a generic signature.
* @see javassist.CtClass#setGenericSignature(String)
* @since 3.26
*/
public void setGenericSignature(String sig) {
genericSignature = sig;
}

/** /**
* Generates a proxy class using the current filter. * Generates a proxy class using the current filter.
* The module or package where a proxy class is created * The module or package where a proxy class is created
finfo4.setAccessFlags(AccessFlag.PUBLIC | AccessFlag.STATIC| AccessFlag.FINAL); finfo4.setAccessFlags(AccessFlag.PUBLIC | AccessFlag.STATIC| AccessFlag.FINAL);
cf.addField(finfo4); cf.addField(finfo4);


if (genericSignature != null) {
SignatureAttribute sa = new SignatureAttribute(pool, genericSignature);
cf.addAttribute(sa);
}

// HashMap allMethods = getMethods(superClass, interfaces); // HashMap allMethods = getMethods(superClass, interfaces);
// int size = allMethods.size(); // int size = allMethods.size();
makeConstructors(classname, cf, pool, classname); makeConstructors(classname, cf, pool, classname);

+ 5
- 3
src/test/Test.java View File



final CtClass ctClass = classPool.get(INVALID_STACK_MAP_FRAME); final CtClass ctClass = classPool.get(INVALID_STACK_MAP_FRAME);
final CtMethod method = ctClass.getDeclaredMethod("bytecodeVerifyError"); final CtMethod method = ctClass.getDeclaredMethod("bytecodeVerifyError");
method.addLocalVariable("test_localVariable", CtClass.intType);
method.insertBefore("{ test_localVariable = 1; }");
ctClass.debugWriteFile();
// method.addLocalVariable("test_localVariable", CtClass.intType);
method.insertBefore("{ java.math.BigDecimal d = null; d.divide(d); }");
//ctClass.debugWriteFile();
System.out.println("ok");
ctClass.writeFile();
Class<?> cc = ctClass.toClass(); Class<?> cc = ctClass.toClass();
System.out.println(cc.getName()); System.out.println(cc.getName());
InvalidStackMapFrame obj = (InvalidStackMapFrame)cc.getDeclaredConstructor().newInstance(); InvalidStackMapFrame obj = (InvalidStackMapFrame)cc.getDeclaredConstructor().newInstance();

+ 4
- 0
src/test/javassist/proxyfactory/GenSig.java View File

package javassist.proxyfactory;

class GenSig<T> {
}

+ 11
- 0
src/test/javassist/proxyfactory/ProxyFactoryTest.java View File

} }
}); });
} }

// Issue #263
public void testGenericSignature() throws Exception {
ProxyFactory factory = new ProxyFactory();
factory.setSuperclass(GenSig.class);
factory.setGenericSignature("Ljavassist/proxyfactory/GenSig<Ljava/lang/Integer;>;");
GenSig gs = (GenSig)factory.create(null, null);
java.lang.reflect.Type[] x = ((java.lang.reflect.ParameterizedType)gs.getClass().getGenericSuperclass())
.getActualTypeArguments();
assertEquals(Integer.class, x[0]);
}
} }

Loading…
Cancel
Save