拥有Class对象的类
- 外部类、成员内部类、静态内部类、局部内部类、匿名内部类
- interface:接口
- 数组
- enum:枚举
- annotation:注解
- 基本数据类型
- void
获取方式
- 前提:已知一个类的全类名,且该类在类路径下,可通过 Class 类的静态方法 forName()获取,可能抛出异常 ClassNotFoundException
应用场景:多用于配置文件,读取类全路径,加载类 - 前提:若已知具体的类,通过类的 class 获取(例如String类的Class对象就是 String.class),该方式最为可靠,程序性能最高
应用场景:多用于参数传递,比如通过反射得到对应构造器对象 - 前提:已知某个类的实例,调用该实例的 getClass()方法获取Class对象
应用场景:通过创建的对象,获取Class对象 - 通过类加载器加载Class类对象
ClassLoader cls = 对象.getClass().getClassLoader();
Class cls01 = cls.loadClass(“类的全类名”); - 基本数据类型(int、char、boolean、float、double、byte、short、long),按如下方式得到 Class 类对象
Class cls = 基本数据类型.class - 基本数据类型的包装类,可以通过 .TYPE 得到Class对象
Class cls = 包装类.TYPE
package com.ftn.reflection.class_;
import com.ftn.Car;
//演示得到Class对象的方式
public class GetClass_ {
public static void main(String[] args) throws Exception {
//1.Class.forName
String classPath = "com.ftn.Car"; //通过配置文件读取
Class> cls = Class.forName(classPath);
System.out.println(cls);
//2.类名.class,应用场景:参数传递
Class cls2 = Car.class;
System.out.println(cls2);
//3.对象.getclass(),应用场景:已有对象实例
Car car = new Car();
Class cls3 = car.getClass();
System.out.println(cls3);
//4.通过类加载器(四种)来获取到类的Class对象
//(1)先得到类加载器 car
ClassLoader classLoader = car.getClass().getClassLoader();
//(2)通过类加载器得到 Class对象
Class> cls4 = classLoader.loadClass(classPath);
System.out.println(cls4);
//cls1cls2cls3cls4 其实是同一个对象
System.out.println(cls.hashCode());
System.out.println(cls2.hashCode());
System.out.println(cls3.hashCode());
System.out.println(cls4.hashCode());
//5.基本数据类型(int,char,boolean,float,double,byte,long,short),按如下方式得到Class类对象
Class integerClass = int.class;
Class characterClass = char.class;
System.out.println(integerClass); //自动拆箱
//6.基本数据类型对应的包装类,可以通过 .TYPE 得到Class类对象
Class type = Integer.TYPE;
System.out.println(type);
System.out.println(type.hashCode());
System.out.println(integerClass.hashCode());
}
}