我能否使用反射在一个类中添加新字段?

12

如果我有一个类的类字面量对象,我能否向该类添加一个新字段?如何确定特定的Class是否被引用或在该类字面量中使用?


1
做这些事情有什么意义呢?它们可能是很好的学术练习,但在生产代码方面,它们几乎总是糟糕的决定。 - corsiKa
@corsiKa 或许你是对的。毕竟这是Java。也许我应该转向一种真正的语言来编写我所追求的“生产”代码。 - Andreas Tasoulas
@atas 我不确定你的意思。截至2013年8月,Java程序员比任何其他语言的程序员都要多(尽管它波动很大,但Java通常非常接近榜首)。我不确定成为最广泛使用的编程语言是否算作“真正”的语言,但实际上有数百万台服务器在生产中运行Java。所以我对你的评论感到非常困惑。 - corsiKa
@corsiKa,我并不是要对Java不敬。我自己也在使用Java,虽然这并不完全是出于个人选择(也许是因为“截至2013年8月,Java程序员比任何其他语言的程序员都多”)... 无论如何,请看看我的回答,并尝试想一种语言,它可以支持这一点,而不需要使用一些外部的重量级库,其中包含诸如“marshaling”之类的臃肿术语;也就是说,作为语言本身的一部分动态生成类型和代码。 - Andreas Tasoulas
我不得不回到这里写下我正在寻找的东西实际上在JVM中:至少包括Groovy元编程和Scala。 - Andreas Tasoulas
显示剩余3条评论
2个回答

6
你无法直接向Class对象中添加新字段。虽然有第三方API可以用于类的生成或修改(例如ASM,BCEL),但是最好避免使用它们,因为它们会增加很多复杂性。
至于你问题的第二部分,你可以使用Class对象来遍历字段并检查它们。
// NOTE : this only looks at the fields in A and not it's superclass.
//        you'll have to do a recursive lookup if you want super's fields too.
for(Field field : A.class.getDeclaredFields()) {
    if(B.class.equals(field.getType()) {
        System.out.println("A." + field.getName() + " is of type B");
    }
}

谢谢,那么关于检查特定类引用的类,比如说我能知道一个A类是否使用了B类的引用吗? - Chandan
我不确定我理解了...你是指如何查看Class A是否有任何字段或方法与Class B相关吗? - stevevls
但是如果我在某个方法中创建类B的引用呢?例如:void create() { class B = new B() } - Chandan
哈...那超出了我的能力范围。你需要反编译代码...也许要研究一下我提到的字节码操作库(ASM、BCEL)? - stevevls

2

您没有说明需要此功能的用途,但如果您想坚持使用Java,则可以考虑JAXB:您将Java类声明为XML,并动态生成它。也许这可以帮助您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接