调用构造方法
Class.newInstance()只能调用public无参数构造方法
String s = (String) String.class.newInstance();//正确
Integer n = (Integer) Integer.class.newInstance();//错误,因为Integer没有无参构造方法
Constructor 对象包含了一个构造方法的所有信息,可以创建一个实例:
Class cls = Integer.class;
//Integer类有两个构造方法,一个是传入的Int基本类型,另外一个传入的String
// Integer(int)
Constructor cons1 = cls.getConstructor(int.class);
//获取int基本类型参数的构造方法,Integer(包装类型)和int(基本类型)class的实例是不同的
//int.class integer.class 代表不同的参数类型
Integer n1 = (Integer) cons1.newInstace(123);
//传入int参数的构造方法创建实例
//Integer(String)
Constructor cons2 = cls.getConstructor(String.class);
Integer n2 = cons2.newInstance("123");
通过Class实例获取Constructor信息:
- getConstructor(Class...):获取某个public的Constructor
- getDeclaredConstructor(Class...):获取某个Constructor
- getConstructors():获取所有public的Constructor
- getDeclaredConstructor():获取所有Construcor
package wensong.com;
public class Student {
private String name ;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public Student(String name) {
this.name = name;
}
public Student() {
this("unnamed");
}
private void hello(){
System.out.println(" hi " + name + " from shanghai");
}
}
package wensong.com;
import java.lang.reflect.Constructor;
import java.util.Arrays;
class Student {
private String name ;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public Student(String name) {
this.name = name;
}
public Student() {
this("unnamed");
}
void hello(){
System.out.println(" hi " + name + " from shanghai");
}
}
public class StudentMain{
public static void main(String [] args) throws Exception{
Class cls = Student.class;//获取Student的实例
Constructor c = cls.getDeclaredConstructor(String.class, int.class);
//获取private两个参数的构造方法
printConstructorInfo(c);
//调用方法,打印构造方法的信息
c.setAccessible(true);
//允许访问这个构造方法
Student s = (Student) c.newInstance("Xiao Ming", 12);
//创建一个Student实例
s.hello();
//打印结果中显示地第四行
}
static void printConstructorInfo(Constructor c){
System.out.println(c);//打印结果中显示地第一行
System.out.println("Parameters: " + Arrays.toString(c.getParameterTypes()));
//打印结果中显示地第二行
System.out.println("modifier: " + c.getModifiers());
//打印结果中显示地第三行
}
}
执行结果:
public wensong.com.Student(java.lang.String,int)
Parameters: [class java.lang.String, int]
modifier: 1
hi Xiao Ming from shanghai
******************************************************************
下面是modifiers的源码数字代表:
public static final int PUBLIC = 0x00000001;
public static final int PRIVATE =0x00000002;
public static final int PROTECTED = 0x00000004;
public static final int STATIC =0x00000008;
public static final int FINAL =0x00000010;
public static final int SYNCHRONIZED = 0x00000020;