一、Constructor<T>
- Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。
- Constructor 允许在将实参与带有底层构造方法的形参的 newInstance() 匹配时进行扩展转换,
- 但是如果发生收缩转换,则抛出 IllegalArgumentException。
二、方法
public final class Constructor<T>extends AccessibleObject implements GenericDeclaration, Member
{
//没有构造方法
//以字符串形式返回此构造方法的名称。它总是与构造方法的声明类的简单名称相同
public String getName(){}
//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。
public T newInstance(Object... initargs)
throws InstantiationException,
IllegalAccessException,
IllegalArgumentException,
InvocationTargetException{}
//返回描述此 Constructor 的字符串,其中包括类型参数
public String toGenericString(){}
//返回描述此 Constructor 的字符串
public String toString(){}
}
三、应用
得到某个类所有的构造方法
- 例子:Constructor[] constructors = Class.forName(“java.lang.String”).getConstructors();
得到某一个构造方法
- 例子:Constructor<String> constructor = (Constructor<String>)Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象
- 通常方式:String str = new String(new StringBuffer(“abc”));
- 反射方式:String str = constructor.newInstance(new StringBuffer(“abc”));
Class.newInstance()方法:
- 例子:String obj = (String)Class.forName(“java.lang.String”).newInstance();
- 该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象
- 该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。。。。
四、示例
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectDemo {
public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
{
Constructor<String> con = (Constructor<String>) Class.forName("java.lang.String").getConstructor(StringBuffer.class);
String str = con.newInstance(new StringBuffer("abc"));
System.out.println(str);
String obj = (String) Class.forName("java.lang.String").newInstance();
System.out.println("<"+obj+">");
}
}