Java反射 - [实例演示] 创建类的对象多种方式
原创
©著作权归作者所有:来自51CTO博客作者ClearlightY的原创作品,请联系作者获取转载授权,否则将追究法律责任
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 "公有的构造器的类";
}
}
运行结果 :