gpt4 book ai didi

Java - 使用反射查找对象的字段

转载 作者:行者123 更新时间:2023-11-30 03:56:14 25 4
gpt4 key购买 nike

我有一个对象引用“inst”、字段名称“f”以及对另一个对象“v”的引用,该引用应该是对象“inst”上名称为 n 的字段的新值。

为了通过反射来做到这一点,我可以使用 getDeclaredField() 和 'set' 方法,但是我不确定当字段 'f' 是某个祖先父类(super class)的字段时,或者当字段当对象是匿名内部类的实例时,属于封闭类。

因此,在我看来,有两条路径可以找到该字段 - 父父类(super class)(使用 getSuperClass())和封闭类(使用 getEnendingClass())。

我的问题是找到该字段的最优雅的方法是什么?

最佳答案

据我所知,有两种不太优雅的方法可以实现此目的:

  1. 使用静态递归方法创建一个辅助类来检查所有跨继承层次结构是否存在该字段,并设置它 - 非常不优雅并且可能有缺陷
  2. 使用“bean”-常规 getter/setter 并使用 getDeclaredMethod,以便利用运行时多态性

这是对第 2 点的快速而粗略的阐述:

package test;

import java.util.ArrayList;
import java.util.List;

public class MyClass {
boolean foo;
int bar;

public void setFoo(boolean value) {
foo = value;
}

public boolean getFoo() {
return foo;
}

public void setBar(int value) {
bar = value;
}

public int getBar() {
return bar;
}

@Override
public String toString() {
return String.format("Foo is %b and bar is %d", foo, bar);
}

public static String toGetterMethodName(String fieldName) {
// TODO no null nor length check here
return "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}

public static String toSetterMethodName(String fieldName) {
// TODO no null nor length check here
return "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
}

public static void main(String[] args) {
// a bunch of reflection...
try {
List<MyClass> instances = new ArrayList<MyClass>();
instances.add((MyClass) Class.forName("test.MyClass$MyChildClass")
.newInstance());
instances.add((MyClass) Class.forName("test.MyClass")
.newInstance());
// default values
System.out.println(instances);
MyClass.class.getMethod(toSetterMethodName("foo"), boolean.class).invoke(instances.get(0), true);
MyClass.class.getMethod(toSetterMethodName("foo"), boolean.class).invoke(instances.get(1), true);
MyClass.class.getMethod(toSetterMethodName("bar"), int.class).invoke(instances.get(0), 42);
MyClass.class.getMethod(toSetterMethodName("bar"), int.class).invoke(instances.get(1), 42);
// values are now set
System.out.println(instances);

}
// TODO no specific Exception handling
catch (Throwable t) {
t.printStackTrace();
}
}

static class MyChildClass extends MyClass {

}
}

输出

[Foo is false and bar is 0, Foo is false and bar is 0]
[Foo is true and bar is 42, Foo is true and bar is 42]

关于Java - 使用反射查找对象的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23113750/

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