Java反射的三种实现方式
第一种:全类名加载
Class<?> aClass1 = Class.forName("com.example.demo.Person");
第二种:类名.class
Class<Person> aClass2 = Person.class;
第三种:对象.getClass
Person jack = new Person("jack", 10);
Class<? extends Person> aClass3 = jack.getClass();
注意:这三种方法所创建的对象是同一个
这三种方法所创建的对象是同一个,因为字节码文件只加载进内存一次,利用这个特性,我们可以实现单例模式
考证如下
package com.example.demo;
public class Demo1 {
public static void main(String[] args) throws ClassNotFoundException {
//全类名加载,将字节码文件加载进内存,返回class对象
Class<?> aClass1 = Class.forName("com.example.demo.Person");
//类名.class,通过类名的属性class获取
Class<Person> aClass2 = Person.class;
//对象.getClass;getClass在Object中定义着
Person jack = new Person("jack", 10);
Class<? extends Person> aClass3 = jack.getClass();
System.out.println(aClass1);
System.out.println(aClass2);
System.out.println(aClass3);
//==比较三个对象
System.out.println(aClass1==aClass2);
System.out.println(aClass1==aClass3);
}
}