当前位置: 代码迷 >> 综合 >> 4Java反射与泛型——1反射——4调用构造方法(廖雪峰)
  详细解决方案

4Java反射与泛型——1反射——4调用构造方法(廖雪峰)

热度:73   发布时间:2024-02-07 02:21:03.0

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构造方法                                                                                            
  相关解决方案