import javassist.bytecode.FieldInfo;
import javassist.bytecode.MethodInfo;
import javassist.bytecode.Opcode;
+import javassist.bytecode.SignatureAttribute;
import javassist.bytecode.StackMapTable;
/*
private String basename;
private String superName;
private Class<?> thisClass;
+ private String genericSignature;
+
/**
* per factory setting initialised from current setting for useCache but able to be reset before each create call
*/
signatureMethods = null;
hasGetHandler = false;
thisClass = null;
+ genericSignature = null;
writeDirectory = null;
factoryUseCache = useCache;
factoryWriteReplace = useWriteReplace;
signature = null;
}
+ /**
+ * Sets the generic signature for the proxy class.
+ * <p>For example,
+ *
+ * <pre>class NullPtr<T> {
+ * T get() { return null; }
+ * }
+ * </pre>
+ *
+ * <p>The following code makes a proxy for <code>NullPtr<String></code>:
+ *
+ * <pre>ProxyFactory factory = new ProxyFactory();
+ * factory.setSuperclass(NullPtr.class);
+ * factory.setGenericSignature("LNullPtr<Ljava/lang/String;>;");
+ * NullPtr<?> np = (NullPtr<?>)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.
* The module or package where a proxy class is created
finfo4.setAccessFlags(AccessFlag.PUBLIC | AccessFlag.STATIC| AccessFlag.FINAL);
cf.addField(finfo4);
+ if (genericSignature != null) {
+ SignatureAttribute sa = new SignatureAttribute(pool, genericSignature);
+ cf.addAttribute(sa);
+ }
+
// HashMap allMethods = getMethods(superClass, interfaces);
// int size = allMethods.size();
makeConstructors(classname, cf, pool, classname);
final CtClass ctClass = classPool.get(INVALID_STACK_MAP_FRAME);
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();
System.out.println(cc.getName());
InvalidStackMapFrame obj = (InvalidStackMapFrame)cc.getDeclaredConstructor().newInstance();
}
});
}
+
+ // 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]);
+ }
}