获取Class对象的几种方式
一、获取Class对象的四种方式
1、通过类.class
获取
Class<Reflect> class1 = Reflect.class;
2、通过对象.getClass()
获取
Class<? extends Reflect> class2 = new Reflect().getClass();
3、通过类Class.forName()
获取
Class<?> class3 = Class.forName("interview.Reflect");
4、通过类ClassLoader.loadClass()
获取
Class<?> class4 = Reflect.class.getClassLoader().loadClass("interview.Reflect");
二、关于获取Class对象的一些引伸
1、反射
反射机制是在运行状态中,对于任意一个类,都能知道其所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
2、Class类中常用方法
getName():返回String形式的该类的名称。
newInstance():根据某个Class对象产生其对应类的实例,它调用的是此类的默认构造方法(没有默认无参构造器会报错)
getClassLoader():返回该Class对象对应的类的类加载器。
getSuperClass():返回某子类所对应的直接父类所对应的Class对象
getConstructor(Class[]) :返回当前 Class 对象表示的类的指定的公有构造子对象。
getConstructors() :返回当前 Class 对象表示的类的所有公有构造子对象数组。
getDeclaredConstructor(Class[]):返回当前 Class 对象表示的类的指定已说明的一个构造子对象。
getDeclaredConstructors() :返回当前 Class 对象表示的类的所有已说明的构造子对象数组。
getDeclaredField(String) :返回当前 Class 对象表示的类或接口的指定已说明的一个域对象。
getDeclaredFields() :返回当前 Class 对象表示的类或接口的所有已说明的域对象数组。
getDeclaredMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定已说明的一个方法对象。
getDeclaredMethods() :返回 Class 对象表示的类或接口的所有已说明的方法数组。
getField(String) :返回当前 Class 对象表示的类或接口的指定的公有成员域对象。
getFields() :返回当前 Class 对象表示的类或接口的所有可访问的公有域对象数组。
getInterfaces() :返回当前对象表示的类或接口实现的接口。
getMethod(String, Class[]) :返回当前 Class 对象表示的类或接口的指定的公有成员方法对象。
getMethods() :返回当前 Class 对象表示的类或接口的所有公有成员方法对象数组,包括已声明的和从父类继承的方法。
isInstance(Object) :此方法是 Java 语言 instanceof 操作的动态等价方法。
isInterface() :判定指定的 Class 对象是否表示一个接口类型
isPrimitive() :判定指定的 Class 对象是否表示一个 Java 的基类型。
3、Class.forName()和ClassLoader.loadClass()的区别
- foranme在类加载的时候会执行静志代码块
- loadclass只有在调用newInstance方法的时候才会执行静态代码块
- 初始化不同:Class.forName()会对类初始化,而loadClass(只会装在或链接。可见的效果就是类中静态初始化段及字节码中对所有静态成员的初始工作的执行(这个过程在类的所有父类中递归地调用).这点就与ClassLoader.loadClass()不同. ClassLoader.loadClass(加载的类对象是在第一次被调用时才进行初始化的。你可以利用上述的差异.比如,要加载一个静态初始化开销很大的类,你就可以选择提前加载该类(以确保它在classpath下),但不进行初始化,直到第一次使用该类的域或方法时才进行初始化
- 类加载器不用:Class.forName(String)方法(只有一个参数),使用调用者的类加载器来加载,也就是用加载了调用forName方法的代码的那个类加载器。当然,它也有个重载的方法,可以指定加载器。相应的,ClassLoader.loadClass()方法是一个实例方法(非静态方法),调用时需要自己指定类加载器,那么这个类加载器就可能是也可能不是加载调用代码的类加载器(调用代用代码类加载器通getClassLoaderoQ获得)