Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java assist将字段声明为参数化列表_Java_Javassist - Fatal编程技术网

使用java assist将字段声明为参数化列表

使用java assist将字段声明为参数化列表,java,javassist,Java,Javassist,我们可以像下面的代码一样声明字段 evalClass.addField(CtField.make("private java.util.List abc;", evalClass)); 如何使用java assist声明字段列出abc?对CtField类做了一些研究。我们可以通过setGenericSignature进行设置 CtField f = new CtField(pool.get(List.class.getCanonicalName()), "abc", evalC

我们可以像下面的代码一样声明字段

evalClass.addField(CtField.make("private java.util.List abc;", evalClass));

如何使用java assist声明字段
列出abc

对CtField类做了一些研究。我们可以通过setGenericSignature进行设置

        CtField f = new CtField(pool.get(List.class.getCanonicalName()), "abc", evalClass);
        f.setGenericSignature(getGenericSignature(relatedClass));
        evalClass.addField(f);

    private String getGenericSignature(Class relatedClass) throws BadBytecode {
        String fieldSignature = "L" + List.class.getCanonicalName().replace(".", "/") + "<L" + String.class.getCanonicalName().replace(".", "/") + ";>;";
        return  SignatureAttribute.toClassSignature(fieldSignature).encode();
    }
CtField f=new-CtField(pool.get(List.class.getCanonicalName()),“abc”,evalClass);
f、 setGenericSignature(getGenericSignature(relatedClass));
evalClass.addField(f);
私有字符串getGenericSignature(类关联类)抛出坏字节码{
String fieldSignature=“L”+List.class.getCanonicalName()。替换(“.”,“/”+”;”;
返回SignatureAttribute.toClassSignature(fieldSignature).encode();
}

首先,Javassist不支持泛型。 从Javassist:

仿制药

Javassist的低级API完全支持 爪哇5。另一方面,更高级别的API(如CtClass)确实如此 不直接支持泛型。然而,这不是一个严重的问题 用于字节码转换

Java的泛型是通过擦除技术实现的。之后 编译时,将删除所有类型参数。例如,假设 您的源代码声明了一个参数化类型向量:

Vector<String> v = new Vector<String>();   
String s = v.get(0); 
所以当你 写一个字节码转换器,你只需要删除所有的类型 参数。因为内嵌在Javassist中的编译器没有 支持泛型,必须在调用方插入显式类型转换 如果源代码是由Javassist编译的,例如,通过 CtMethod.make()。如果源代码为,则不需要类型转换 由普通Java编译器(如javac)编译

所以你基本上可以用你在问题中写的方法来添加一个没有通用规范的列表,这样就可以完成工作了

Vector v = new Vector();   
String s = (String)v.get(0);