您的位置:

newInstance()方法详解

一、newInstance()方法简介

public T newInstance() throws InstantiationException, IllegalAccessException

newInstance()方法是Java中的一个非常重要的方法,在反射中经常被使用。它可以创建指定类的一个新实例,并返回该实例。newInstance()方法不需要显式地调用构造函数,因此可以通过该方法来创建没有声明public构造函数的类的实例。

二、newInstance()方法被什么代替了

1、Class.getDeclaredConstructor().newInstance()

Class clazz = Student.class;
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
Student student = constructor.newInstance("Tom", 18);

  

在Java 9之后,newInstance()方法已经被废弃,建议使用Class.getDeclaredConstructor().newInstance()来代替。该方法可以通过Class对象获取指定构造函数并创建实例。

2、Constructor.newInstance()

Class clazz = Student.class;
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
Student student = constructor.newInstance("Tom", 18);

  

在Java 9之前,newInstance()方法被废弃前的推荐替代方案是Constructor.newInstance()。该方法通过Constructor对象获取指定构造函数,并创建实例。

三、newInstance()方法的使用

1、创建类的实例

public class Student {
    private String name;
    private int age;
  
    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
  
    @Override
    public String toString(){
        return "Name: " + name + ", Age: " + age;
    }
}

Class clazz = Student.class;
Student student = (Student) clazz.newInstance();
student.setName("Tom");
student.setAge(18);
System.out.println(student);

newInstance()方法可以用来创建一个类的实例,如上述代码所示。它通过Class对象获取类的引用并调用无参构造函数。在创建实例后,可以通过调用对象的setter方法来设置属性值并输出结果。

2、创建子类的实例

public class Animal {
    public void eat(){
        System.out.println("Animal is eating.");
    }
}

public class Dog extends Animal {
    public void bark(){
        System.out.println("Dog is barking.");
    }
}

Class clazz = Dog.class;
Dog dog = (Dog) clazz.newInstance();
dog.eat();
dog.bark();

newInstance()方法还可以用来创建子类的实例。如上述代码所示,首先创建一个包含eat()和bark()方法的Dog类,并将其作为Animal类的子类。然后,使用newInstance()方法创建Dog类的实例并调用eat()和bark()方法,输出结果。

3、通过Class.forName()获取类的实例

Class clazz = Class.forName("com.example.Student");
Student student = (Student) clazz.newInstance();

在某些情况下,通过直接传递类的引用给newInstance()方法可能会出现编译时错误。这时候可以使用Class.forName()方法来获取类的引用。如上述代码所示,传递包含完整类名的字符串给Class.forName()方法,获取类的引用并使用newInstance()方法创建实例。

四、总结

newInstance()方法是Java中非常重要的一个方法,在反射中经常被使用。在Java 9之后,newInstance()方法已经被废弃,建议使用Class.getDeclaredConstructor().newInstance()来代替。