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构造方法