diff options
Diffstat (limited to 'src/main/javassist/util/proxy/ProxyFactory.java')
-rw-r--r-- | src/main/javassist/util/proxy/ProxyFactory.java | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/main/javassist/util/proxy/ProxyFactory.java b/src/main/javassist/util/proxy/ProxyFactory.java index 98e352ca..7d88e07a 100644 --- a/src/main/javassist/util/proxy/ProxyFactory.java +++ b/src/main/javassist/util/proxy/ProxyFactory.java @@ -49,6 +49,7 @@ import javassist.bytecode.ExceptionsAttribute; import javassist.bytecode.FieldInfo; import javassist.bytecode.MethodInfo; import javassist.bytecode.Opcode; +import javassist.bytecode.SignatureAttribute; import javassist.bytecode.StackMapTable; /* @@ -186,6 +187,8 @@ public class ProxyFactory { 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 */ @@ -389,6 +392,7 @@ public class ProxyFactory { signatureMethods = null; hasGetHandler = false; thisClass = null; + genericSignature = null; writeDirectory = null; factoryUseCache = useCache; factoryWriteReplace = useWriteReplace; @@ -436,6 +440,34 @@ public class ProxyFactory { } /** + * 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 * has to be opened to this package or the Javassist module. @@ -885,6 +917,11 @@ public class ProxyFactory { 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); |