Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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 我可以使用反射在类中添加新字段吗_Java_Reflection - Fatal编程技术网

Java 我可以使用反射在类中添加新字段吗

Java 我可以使用反射在类中添加新字段吗,java,reflection,Java,Reflection,如果我有一个类文本对象,我可以向该类添加一个新字段吗?我如何确定某个特定的类在该类文本中被引用或使用?您不能直接向类对象添加一个新字段。您可以使用第三方API生成或修改类(例如ASM、BCEL),但最好避免使用这些API,因为它们会增加很多复杂性 至于问题的第二部分,您可以使用类对象遍历字段并检查它们 // NOTE : this only looks at the fields in A and not it's superclass. // you'll have to do

如果我有一个类文本对象,我可以向该类添加一个新字段吗?我如何确定某个特定的类在该类文本中被引用或使用?

您不能直接向
对象添加一个新字段。您可以使用第三方API生成或修改类(例如ASM、BCEL),但最好避免使用这些API,因为它们会增加很多复杂性

至于问题的第二部分,您可以使用
对象遍历字段并检查它们

// 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");
    }
}

你不需要说明这个特性,但是如果你想坚持java,也许你想考虑JAXB:你声明java类是XML,它是动态生成的。也许这会有帮助。

thnx那么检查类以获得特定的类引用怎么样,比如,我能知道a类是否在使用BI类的引用吗?我不确定我是否理解…你的意思是,如何查看a类是否有引用B类的字段或方法?但是,如果我在某个方法中创建B类引用呢?比如void create(){Class B=new B()}Ha…我无法理解。你必须对代码进行反编译…也许可以看看我提到的字节码操作库(ASM,BCEL)?做这些事情的目的是什么?它们可能是很好的学术练习,但在生产代码方面几乎总是糟糕的决策。glowcoder@you是的,但是当您编写自己的类加载器时,如果您想检查您的类加载器正在加载的类是否不应违反某些条件,例如使用未经授权的代码,那么您将如何做,编写自己的类加载器解决了什么问题?我的意思是,谁可以访问生产系统,首先在那里放置未经授权的代码?@corsiKa也许你是对的。毕竟这是Java。也许我应该换一种真正的语言来编写我想要的“产品”代码。@atas我不知道你的意思。截至2013年8月,Java程序员比任何其他语言都多(尽管它波动很大,Java通常非常接近顶端)。我不确定作为使用最广泛的编程语言是否算是“真正的”语言,但实际上有数百万台服务器在生产中运行Java。所以我对你的评论感到困惑。