1newInstance
Class.newInstance()只能调用public无参数构造方法
String s = (String) String.class.newInstance();
Integer n = (Integer) Integer.class.newInstance();//不能直接调用,因为Integer没有定义无参数的构造方法
2Constructor对象
如何调用带参数的构造方法呢?
可以调用Constructor方法,Constructor对象包含一个构造方法的所有信息,可以创建一个实例:
Class cls = Integer.class;
//Integer(int)
Constructor n1 = cls.getConstructor(int.class);
Integer n1 = (Integer) cons1.newInstance(123);
//Integer(String)
Constructor n2 = cls.getConstructor(String.class);
Integer n2 = (Integer) cons2.newInstance("123");
通过Class实例获取Constructor信息:
- getConstructor(Class...):获取某个public的Constructor
- getDeclaredConstructor(Class...):获取某个Constructor
- getConstructors(Class...):获取所有public的Constructor
- getDeclaredConstructors(Class...):获取所有Constructor
3实例演示
public class Main {
public static void main(String[] args) throws Exception{
Class cls = Student.class;
Constructor c = cls.getDeclaredConstructor(String.class,int.class);
printConstructorInfo(c);
c.setAccessible(true);//允许访问该构造方法
Student s = (Student) c.newInstance("Xiao Ming",12);
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 class Student extends Person implements Hello{
public static int number = 0;
public String name;
private String address = "beijing";
public Student() {
this("unnamed");
}
public Student(String name) {
this(name,20);
}
private Student(String name,int age){
this.name = name;
this.age = age;
number++;
}
public void hello() {
System.out.println("Hi, "+name+" from " +address +"!");
}
}
public class Person {
public int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public interface Hello {
public void hello();
}
4SecurityManager
通过设置setAccessible(true)来访问非public构造方法,serAccessible(true)可能会失败:
- 定义了SecurityManager
- SecurityManager的规则阻止对该Constructor设置accessible:例如,规则应用与所有Java和Javax开头的package的类
5总结
- Constructor对象封装了构造方法的所有信息
- 通过Class实例的方法可以获取Constructor实例:getConstructor()/getDeclaredConstructor()/getConstuctors()/getDeclaredConstructors()
- 通过Constructor实例可以创建一个实例对象:newInstance(Object...parameters)
- 通过设置setAccessible(true)来访问非public构造方法