2013-05-30 70 views
0

鉴于以下斯卡拉类:Java反射和斯卡拉类

class Student (_name:String, _id:Long) { 

private var name:String = _name; 
private var id:Long = _id; 

// 2nd C'tor 
def this(_name:String) = this(_name,0); 

// 3rd C'tor 
def this(_id:Long) = this("No Name",_id); 

def printDetails() { 

    println("The student's name is : " + name); 
    println("The student's id is : " + id); 

} 

} 

和下面的Java类:

public class StudentReflectionDemo { 

public static void main (String[] args) { 

    try { 
     Class cl = Class.forName("ClassesAndObjects.Student"); 
     Method[] methods = cl.getMethods(); 
     Field[] fields = cl.getFields(); 

     System.out.println("The methods of the Student class are : "); 

     for (int i = 0 ; i < methods.length; i++) { 
      System.out.println(methods[i]); 
     } 

     System.out.println("The fields of the Student class are : "); 

     for (int i = 0 ; i < fields.length; i++) { 
      System.out.println(fields[i]); 
     } 

    } 
    catch(ClassNotFoundException e) { 
     e.printStackTrace(); 
    } 


} 

} 

它不正确输出的学生类的方法,但它不打印学生类字段..

我在这里错过了什么?

感谢

回答

4

在Java中,getFields()方法只返回public领域。要获取所有字段,请使用getDeclaredFields(),这将返回直接在类上声明的所有字段。

+0

呃...嘿嘿。谢谢:) – Rouki

+0

请注意,如果你想实际*访问私人领域,你需要使用'setAccessible()'来访问它。更多信息[这里](http://www.onjava.com/pub/a/onjava/2003/11/12/reflection.html)。 –

3

如果你看的Javadoc getFields()你看到了答案:

返回一个容纳所有访问公共字段所代表的类或接口的 Field对象的数组这个Class对象。

需要使用getDeclaredFields()代替:

返回Field对象反映此Class对象所表示的类或接口声明的所有字段的数组。这包括公共,受保护,默认(包)访问和专用字段,但不包括继承字段。