gpt4 book ai didi

java - 获取对抽象类中私有(private)最终字段的引用

转载 作者:行者123 更新时间:2023-12-04 00:46:49 26 4
gpt4 key购买 nike

我有一个对象 A 的引用,它是抽象的。此对象在任何时候也是对象 BCD 的实例。

无论扩展类如何,我都需要引用 A 中特定类型的 private final 字段。

我不知道字段的名称,只知道它的类型,它对于抽象类中的所有其他字段都是唯一的。我无法更改列出的四个类中任何一个的代码。使用 getDeclaredFields() 返回我当时拥有的任何扩展类中的字段。

我怎样才能得到这个字段的引用?

最佳答案

您需要在类 A 本身上调用 getDeclaredFields(),然后使用反射来设置可访问的字段

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class Test{

public static void main(String args[]){
B someB = new B();
B otherB = new B();

Field uniqueField = null;

for(Field f : A.class.getDeclaredFields()){
if(!Modifier.isFinal(f.getModifiers()))
continue;
if(!UNIQUE.class.isAssignableFrom(f.getType()))
continue;

uniqueField = f;
break;
}
if(null == uniqueField)
throw new NullPointerException();

uniqueField.setAccessible(true);

try{
System.out.println(uniqueField.get(someB) != uniqueField.get(otherB));
}catch(IllegalArgumentException | IllegalAccessException e){
throw new RuntimeException(e);
}
}

}

class UNIQUE{
}

class A{
private final UNIQUE u;
private final String someOtherMember = "";

A(){
u = new UNIQUE();
}

}

class B extends A{

}

如果您没有对 A 类的直接引用,或者如果有不止一个父类(super class)具有此唯一字段,那么您可以遍历每一个(确保在每一站检查您没有攀登所有反对的方式)通过在上面的例子中做更像这样的事情

  Class<?> clazz = someB.getClass();
classClimb: do{
for(Field f : clazz.getDeclaredFields()){
if(!Modifier.isFinal(f.getModifiers()))
continue;
if(!UNIQUE.class.isAssignableFrom(f.getType()))
continue;

uniqueField = f;
break classClimb;
}
}while(Object.class != (clazz = clazz.getSuperclass()));
if(null == uniqueField)
throw new NullPointerException();

uniqueField.setAccessible(true);

try{
System.out.println(uniqueField.get(someB) != uniqueField.get(otherB));
}catch(IllegalArgumentException | IllegalAccessException e){
throw new RuntimeException(e);
}

请记住,在那种情况下,您将不得不对每个对象进行反射,进行一些缓存,或者拥有多个特定于每个预期父类(super class)的反射站点。

关于java - 获取对抽象类中私有(private)最终字段的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17205557/

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