我需要一个函数,它将返回我的类中所有私有数据成员的名称作为字符串(可能在数组或列表中?),其中每个字符串都是我的班级中的私人非最终数据成员的姓名。非最终条件是可选的,但它会很好。如何获取类中所有私有数据成员的名称
1)这可能吗?我认为有一种方法可以检索一个类中的所有方法名称,所以我认为这也是可能的。
2)我知道我在问一个问题,但我该怎么做?
编辑
我不知道从哪里开始。
看来java.lang.reflect
是一个很好的开始。我已经开始在那里研究。
我需要一个函数,它将返回我的类中所有私有数据成员的名称作为字符串(可能在数组或列表中?),其中每个字符串都是我的班级中的私人非最终数据成员的姓名。非最终条件是可选的,但它会很好。如何获取类中所有私有数据成员的名称
1)这可能吗?我认为有一种方法可以检索一个类中的所有方法名称,所以我认为这也是可能的。
2)我知道我在问一个问题,但我该怎么做?
编辑
我不知道从哪里开始。
看来java.lang.reflect
是一个很好的开始。我已经开始在那里研究。
这应该可以做到。基本上,你列出了你班级的所有领域,并删除了一个不私人的领域。 :
public static void main(String [] args){
List<Field> list = new ArrayList<>(Arrays.asList(A.class.getDeclaredFields()));
for(Iterator<Field> i = list.iterator(); i.hasNext();){
Field f = i.next();
if(f.getModifiers() != Modifier.PRIVATE)
i.remove();
}
for(Field f : list)
System.out.println(f.getName());
}
输出:
fieldOne
fieldTwo
A类:
class A {
private String fieldOne;
private String fieldTwo;
private final String fieldFinal = null;
public char c;
public static int staticField;
protected Long protectedField;
public String field;
}
你应该使用'' - 在((f.getModifiers()Modifier.PRIVATE)= Modifier.PRIVATE!)除了私人领域,这个领域也可能是最终的,静态的等等。 –
@BrianS你如何解释fieldFinal没有出现在结果列表中?使用你的代码,我也会在我的结果列表中获得fieldFinal。 – user2336315
对不起,我的评论是基于'gotModifiers()'和'Modifier'类的文档,没有运行你的代码。 'getModifiers()'说:“返回字段的Java语言修饰符......修饰符类应该用于解码修饰符。”而“Modifier”类则表示“修饰符的集合被表示为具有代表不同修饰符的不同位位置的整数”。 (换句话说,是一个位域。)我会研究它。 –
Object someObject = getItSomehow();
for (Field field : someObject.getClass().getDeclaredFields()) {
field.setAccessible(true); // You might want to set modifier to public first.
Object value = field.get(someObject);
if (value != null) {
System.out.println(field.getName() + "=" + value);
}
}
您可以访问由Class.getDeclaredMethods所有公共方法(),但为了访问您的私有方法必须知道私有方法的名称。
要访问私有方法:
Method privateMethod = MyObj.class.
getDeclaredMethod("myPrivateMethod", null); //return private method named "myPrivateMethod"
privateMethod.setAccessible(true); //turn off access check for reflection only
Object o = privateMethod.invoke(MyObj, null); //call private method
我不想调用私有**方法**。请仔细阅读该问题。 – Josh
如果您正在编写新类,则可以将列表中的私有方法名称定义为类成员变量。但是你无法获得私有方法的列表。 –
'java.lang.reflect'包 – afk5min