一、概述
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();
该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。
该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
注:该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象
二、代码示例
1、ReflectPoint.java
package staticimport.reflect;
public class ReflectPoint {
private int x;
public int y;
private ReflectPoint(){}
public ReflectPoint(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "ReflectPoint [x=" + x + ", y=" + y + "]";
}
}
2、ReflectConstructorTest.java
package staticimport.reflect;
import java.lang.reflect.Constructor;
public class ReflectConstructorTest {
public static void main(String[] args) throws Exception {
Constructor constructor = String.class.getConstructor(StringBuffer.class);
String str = (String) constructor.newInstance(/*"abc"*/new StringBuffer("abc"));
System.out.println(str.charAt(2));
//测试私有构造器访问,结果和私有字段访问一致
Constructor constructor2 = ReflectPoint.class.getDeclaredConstructor();
constructor2.setAccessible(true);
ReflectPoint reflectPoint = (ReflectPoint) constructor2.newInstance();
System.out.println(reflectPoint);
}
}