gpt4 book ai didi

java - 如何使用反射更新层次结构中的成员

转载 作者:行者123 更新时间:2023-11-30 08:50:47 25 4
gpt4 key购买 nike

我有一个继承自 car 的名为 Volvo 的类。
它包含一个名为 Engine 的类,其中包含 Valve。

public class Engine {

public Engine(int e, int f) {
this.e = e;
valve = new Valve(f);
}

private int e;
private Valve valve;
}

valve 有一个数据成员——int f;

public class Valve {
public Valve(int f) {
this.f = f;
}

public int f;
}

一切都是私有(private)的,不包含 setter。

我想使用以下字符串使用反射设置一个值

fillIn(volvo, "Engine.Valve.f", 10);

使用这段代码:

String[] splits = path.split("\\.");
Class tmpClass = obj.getClass();

for (int i = 0; i < splits.length; i++) {
if (i + 1 != splits.length) {
Field field = tmpClass.getDeclaredField(splits[i]);
tmpClass = field.getClass();
} else {
System.out.println("**** - " + splits[i]);
}
}

问题:
1.我的对象是沃尔沃。发动机位于汽车。在 volvo 上迭代时我可以得到这个字段吗?
2.如何设置值?每次的类型都不一样。
3. 是否有更好的做法(FW?)可以做到这一点?

谢谢。

最佳答案

要访问私有(private)字段,您可以像这样在字段上将访问权限设置为 true:

field.setAccessible(true);

看这个例子:
http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html
和javadoc
http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible(boolean)


顺便说一句,使用 setter 肯定会更好
编辑:
您需要存储要设置的字段的对象:
一些经过编辑的代码,由 javadoc 编写,未经测试

String[] splits = path.split("\\.");
Class tmpClass = obj.getClass();
Object tmpObject = obj;

for (int i = 0; i < splits.length; i++) {
if (i + 1 != splits.length) {
Field field = tmpClass.getDeclaredField(splits[i]);
tmpClass = field.getClass();
if(tmpClass.equals(Integer.class)){
field.setInt(tmpObject,42); //where 42 is the number to set
return;
}
tmpObject = field.get(tmpObject); // tmpObject contais the object to set
}
}

也许代码行不通,但我希望它能表达想法

关于java - 如何使用反射更新层次结构中的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com