2013-12-11 24 views
0

我需要一个函数,它将返回我的类中所有私有数据成员的名称作为字符串(可能在数组或列表中?),其中每个字符串都是我的班级中的私人非最终数据成员的姓名。非最终条件是可选的,但它会很好。如何获取类中所有私有数据成员的名称

1)这可能吗?我认为有一种方法可以检索一个类中的所有方法名称,所以我认为这也是可能的。

2)我知道我在问一个问题,但我该怎么做?

编辑

我不知道从哪里开始。

看来java.lang.reflect是一个很好的开始。我已经开始在那里研究。

+5

'java.lang.reflect'包 – afk5min

回答

2

这应该可以做到。基本上,你列出了你班级的所有领域,并删除了一个不私人的领域。 :

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; 
} 
+0

你应该使用'' - 在((f.getModifiers()Modifier.PRIVATE)= Modifier.PRIVATE!)除了私人领域,这个领域也可能是最终的,静态的等等。 –

+0

@BrianS你如何解释fieldFinal没有出现在结果列表中?使用你的代码,我也会在我的结果列表中获得fieldFinal。 – user2336315

+0

对不起,我的评论是基于'gotModifiers()'和'Modifier'类的文档,没有运行你的代码。 'getModifiers()'说:“返回字段的Java语言修饰符......修饰符类应该用于解码修饰符。”而“Modifier”类则表示“修饰符的集合被表示为具有代表不同修饰符的不同位位置的整数”。 (换句话说,是一个位域。)我会研究它。 –

1
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); 
    } 
} 
0

您可以访问由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 
+0

我不想调用私有**方法**。请仔细阅读该问题。 – Josh

+0

如果您正在编写新类,则可以将列表中的私有方法名称定义为类成员变量。但是你无法获得私有方法的列表。 –

相关问题