Java通过反射可以创建类的对象

创建类的对象方式除了​​​new​​​,​​Class.newInstance()​​​这两种方式可以创建共有的构造函数的对象外

还可以通过​​​Constructor类​​来设置反射对象的accessible标志为true,来创建私有构造器类的对象.


反射定义

反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

反射的作用

  • 在运行时判断任意一个对象所属的类。
  • 在运行时判断任意一个类所具有的成员变量和方法。
  • 在运行时任意调用一个对象的方法
  • 在运行时构造任意一个类的对象

原址 : ​​反射有什么作用​


案例演示

这个案例将通过new与反射的方式来创建私有以及共有构造器类的对象.

package top.clearlight.coretech.reflect;

import java.lang.reflect.Constructor;

public class ReflectTest {
public static void main(String[] args) throws Exception {
// "PriConstructO' has private access in ' top. clearlight. coretech. reflect. PriConstruct'
// PriConstruct pri = new PriConstruct();

// 创建私有 无参 构造器的类对象的方式
Constructor<PriConstruct> dc = PriConstruct.class.getDeclaredConstructor();
dc.setAccessible(true);
PriConstruct pri = dc.newInstance();
System.out.println("Constructor对象创建私有无参构造器类的对象 : " + pri.toString());

// 创建私有 有参 构造器的类对象的方式
Constructor<PriConstruct> dc2 = PriConstruct.class.getDeclaredConstructor(String.class, int.class);
dc2.setAccessible(true);
PriConstruct pri2 = dc2.newInstance("Marry", 17);
System.out.println("Constructor对象创建私有有参构造器类的对象 : " + pri2.toString());

System.out.println("----------------");

// 创建对象的第一种方式
PubConstruct pub = new PubConstruct();
System.out.println("new方式构造的对象 : " + pub.toString());
// 创建对象的第二种方式
PubConstruct pubConstruct1 = pub.getClass().newInstance();
System.out.println("对象.getClass().newInstance()方式构造的对象 : " + pubConstruct1.toString());
// 创建对象的第三种方式
PubConstruct pubConstruct = (PubConstruct) Class.forName("top.clearlight.coretech.reflect.PubConstruct").newInstance();
System.out.println("Class.forName(全限定类名).newInstance()方式2构造的对象 : " + pubConstruct.toString());

// 创建对象的第四种方式
PubConstruct pubConstruct2 = PubConstruct.class.newInstance();
System.out.println("类名.class.newInstance()方式创建对象 : " + pubConstruct2.toString());
}
}

class PriConstruct {
private String name;
private int age;
private PriConstruct() { }

private PriConstruct(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "PriConstruct{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

class PubConstruct {
PubConstruct() { }

@Override
public String toString() {
return "公有的构造器的类";
}
}

运行结果 :

Java反射 - [实例演示] 创建类的对象多种方式_Java反射