上一篇文章介绍了 Java 反射机制的源头 Class 类,今天我们来了解如何通过一个给定的字符串(包.类)的路径来实例化一个类的对象,以及通过反射得到一个类的具体结构。
一、Class.forName() 方法实例化类的对象
1、通过无参构造方法实例化对象
通过一个给定的字符串(包.类)的路径,我们可以利用 Class.forName() 方法获取到给的的类,然后通过调用该类的 newInstance() 方法实例化此类的对象,这样就取代了使用 new 关键字实例化对象的操作方式。
通过调用类的 newInstance() 方法实例化类的对象,需要特别注意一点,就是必须要保证被实例化的类中存在一个无参的构造方法,如果不存在无参构造方法,是无法使用 newInstance() 方法实例化类的对象的。
反射的大部分操作基本上都是调用无参构造方法,因此,提倡大家在开发中,一定要在类中编写无参的构造方法。
@Test
public void test1() throws Exception {
String className = "com.jpm.reflection.User";
Class clazz = Class.forName(className);
// 创建运行时类的对象,需要运行时类有空的构造函数
Object obj = clazz.newInstance();
System.out.println(obj);
}
User 类的代码上一篇文章里有,本次为了节省篇幅,就不再重复提供源码了:
运行结果:
User [name=null, age=0]
2、通过有参构造方法实例化对象
虽然一般我们使用无参的构造方法来实例化类的对象,但是我们依然可以用有参构造方法来实例化对象,此时,需要用到 java.lang.reflect.Constructor 类,它表示构造方法,首先通过 Class 类的 getConstructors() 方法,获得本类中所有构造方法,通过调用构造方法的 newInstance(Object ... initargs) 方法,传递一个可变对象参数,完成对象的实例化操作。
@Test
public void test2() throws Exception {
String className = "com.jpm.reflection.User";
Class clazz = Class.forName(className);
// 通过反射获取所有构造方法
Constructor[] con = clazz.getConstructors();
for (Constructor c : con) {
System.out.println("获取到的构造方法:" + c);
}
// 通过2个参数的构造方法创建对象
Object obj = con[0].newInstance("JPM", 20);
System.out.println(obj);
}
运行结果:
获取到的构造方法:public com.jpm.reflection.User(java.lang.String,int)
获取到的构造方法:public com.jpm.reflection.User(java.lang.String)
获取到的构造方法:public com.jpm.reflection.User()
User [name=JPM, age=20]
二、通过反射取得类的结构
通过反射可以得到一个类的完整结构,需要使用到 java.lang.reflect 包中的以下类:
Constructor:表示类中的构造方法
Field:表示类中的属性
Method:表示类中的方法
下面为了演示反射的例子,我们提供一个 Person 类:
public class Person implements Comparable