java反射⽗类变量_Java反射获取⽗类中的元素
我们知道,可以通过getDeclaredField和getField⽅法可以反射获取class中的元素,他们的区别在于getField只能访问公有变量,⽽getDeclaredField则可以访问定义的所有变量,包括protected修饰和private修饰的变量。
化妆工具// 1.getDeclaredField⽅法调⽤archFields⽅法
Field field = archFields(privateGetDeclaredFields(fal), name);
// 2.getField⽅法剪接调⽤archFields⽅法
if ((res = archFields(privateGetDeclaredFields(true), name)) != null) {
return res;
}
不过,若要访问⽗类中的元素,通过getDeclaredField和getField⽅法就会抛出NoSuchFieldException异常了。也就是说,⽆法直接⽤java.lang.Class中的⽅法去访问⽗类中的元素。Spring中的⼯具类org.sprin
gframework.util.ReflectionUtils提供了findField⽅法,能够取得⽗类中的元素。我们看⼀下其中的实现:
public static Field findField(Class> clazz, String name, Class> type) {
Asrt.isTrue(name != null || type != null, "Either name or type of the field must be specified");小峨眉
Class> archType = clazz;
while (!Object.class.equals(archType) && archType != null) {
// 这⾥⼀次性获取了类中的所有元素
Field[] fields = DeclaredFields();
for (Field field : fields) {
if ((name == null || name.Name())) && (type == null || type.Type()))) {
return field;
}资料员职责
}
// 获取所有⽗类,接着遍历⽗类中的元素。
archType = Superclass();
}
return null;
}
笔者本希望通过getDeclaredField()⽅法直接反射获取class中的元素,不过为了获取其⽗类中的元素使⽤了⼯具类ReflectionUtils。我们通过计算getDeclaredField()⽅法和ReflectionUtils.findField()⽅法在1秒内获取类中元素的次数来判断两者的性能。
public static void main(String[] args) {
try {室内高尔夫
int times = 0;
long startMili = System.currentTimeMillis();
雅思分数计算while (true) {
long nowMili = System.currentTimeMillis();
DeclaredField("balance");
times++;
if (nowMili > startMili + 1000) {
break;
}
}
System.out.println("getDeclaredField⽅法执⾏了" + times + "次");
times = 0;
一月到十二月
startMili = System.currentTimeMillis();
while (true) {
龙年成语long nowMili = System.currentTimeMillis();
ReflectionUtils.findField(InteBidResultDTO.class, "balance");
times++;
if (nowMili > startMili + 1000) {
break;
}
}
凌云之志System.out.println("findField⽅法执⾏了" + times + "次");
} catch (SecurityException | NoSuchFieldException e) {
e.printStackTrace();
}
}
运⾏结果是:
getDeclaredField⽅法执⾏了3200996次
findField⽅法执⾏了2434921次
由于ReflectionUtils.findField()⽅法会去查找⽗类中的元素,性能必然会差⼀些。如果⼀个类的⽗类祖先越多,遍历次数也就越多,上述运⾏结果的差距也就更加明显。