天天看点

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

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 "公有的构造器的类";
    }
}