(1) 通过类名获取Class对象:
若在编译期知道一个类的名字,我们可以这样获取它的Class对象:
1 Class<People> peopleClass = People.class;
还有一种根据类的完整路径名获取Class对象的方法如下所示:
1 Class<People> peopleClass = Class.forName("com.test.People"); //假设People类在com.test包中
注意,Class.forName()方法的参数必须是一个类的全路径名。实际上,只要我们“import com.test.People",就可以直接通过”People.class"获取他的Class对象,而不用写出全路径这么麻烦。
(若在调用 Class.forName()方法时,没有在classpath找到对应的类,会抛出 ClassNotFoundException。)
(2) 通过对象本身获取其Class对象:
1 People people = new People("Bill", 18);2 Class<People> peopleClass = people.getClass();
3. 通过反射获取类的构造器 一旦我们获得了People的Class 对象,我们便可以通过这个Class 对象获取到People类的原始定义信息。 首先,我们来获取People类的构造器对象,有了这个构造器对象,我们便能够构造出一个People对象出来。比如,我们可以在Student.java中添加以下代码:
[url=][/url]
[url=][/url]
1 public static void main(String[] args) { 2 Class<People> pClass = People.class; 3 System.out.println(pClass); 4 try { 5 Constructor<People> constructor = pClass.getConstructor(String.class, int.class); 6 People people = constructor.newInstance("Bill", 18); 7 obj.speak(); 8 } catch (Exception e) { 9 e.printStackTrace();10 }11 }[url=][/url]
[url=][/url]
在第4行,我们调用getConstructor方法来获取一个People类的构造器对象,由于我们想要获取的构造器的形参类型为String和int,所以我们传入String.class和int.class。有了构造器对象,我们便可以调用newInstance方法来创建一个people对象,如上面代码的第6行所示。
注意,当通过反射获取到类的 Constructor、Method、Field对象后,在调用这些对象的方法之前,先将此对象的 accessible 标志设置为 true,以取消 Java 语言访问检查,可以提升反射速度。如以下代码所示:
1 Constructor<People> constructor = peopleClass.getConstructor(String.class, int.class);2 // 设置 constructor 的 Accessible属性为ture以取消Java的访问检查3 constructor.setAccessible(true); |