一、反射
1、反射就是把Java类中的各种成分映射成相应的Java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量、方法、构造方法、包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示Java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Constructor、Package等等。
2、一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象后,得到这些实例对象后有什么用呢?怎么用呢?这正是学习和应用反射的要点。
二、Constructor类
1、Constructor类代表某个类中的一个构造方法
2、得到某个类所有的构造方法:
例子:
Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();
3、得到某一个构造方法
例子:
Constructor constructor = Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
4、创建实例对象
通常方式:
String str = new String(new StringBuffer(“abc”));
反射方式:
String str = (String)constructor.newInstance(new StringBuffer(“abc”));
5、Class.newInstance()方法
例子:
String obj = (String)Class.forName(“java.lang.String”).newInstance();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象;
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
6、示例代码
package cn.sunft.day01.reflect;
import java.lang.reflect.Constructor;
public class ConstructorTest {
public static void main(String[] args) throws Exception {
//new String(new StringBuffer("abc"))
//获取指定参数的构造器
Constructor constructor1 =
String.class.getConstructor(StringBuffer.class);
//构造的时候,需要传入一个StringBuffer的实例
String str1 = (String)
constructor1.newInstance(new StringBuffer("abc"));
System.out.println(str1.charAt(2));//c
}
}