一、目录
- Class类介绍
- Class类常用方法
- 获取Class对象的方式
- Class也是类,因此也继承Object类。
- Class类对象不是new出来的,而是系统创建的。
- 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次。
- 每个类的实例都会记得自己是由哪个Class实例所生成。
- 通过Class可以完整地得到一个类的完成结构,通过一系列API操作而得到类的各个成员。
- Class对象是存放在堆的。
- 类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括方法代码、变量名、方法名、访问权限等)。
package com.javareflection;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class JavaClass {
public static void main(String[] args) throws Exception {
// 1. 获取到Cat类对应的Class对象
Class cls = Class.forName("com.javareflection.Cat");
// 2. 输出Class对象的运行类型
System.out.println(cls); //显示cls对象,是哪个类的Class对象 Class com.javareflection.Cat
System.out.println(cls.getClass()); //输出cls的运行类型 Class java.lang.Class
// 3. 得到包名
System.out.println(cls.getPackage().getName()); //com.javareflection
// 4. 得到类名
System.out.println(cls.getName()); //com.javareflection.Cat
// 5. 通过Class对象创建对象实例
Object o = cls.newInstance(); //这里就可以直接向下转型了 Cat cat = (Cat)cls.newInstance();
// 6. 通过反射获取属性值
Field catname = cls.getField("catname");
System.out.println(catname.get(o));
// 7. 通过反射给属性设值
catname.set(o, "Jerry");
System.out.println(catname.get(o));
// 8. 一次性拿到所有属性
Field[] fields = cls.getFields();
for(Field f : fields){
System.out.println(f.getName());
}
// 9. 通过属性获取方法
Method info = cls.getMethod("info");
info.invoke(o);
}
}
class com.javareflection.Cat
class java.lang.Class
com.javareflection
com.javareflection.Cat
Tom
Jerry
catname
age
The cat's name is Jerry
四、获取Class对象的方式
-
前提:已知一个类的全类名,且该类在类路径下,可通过Class类的静态方法forName()获取,可能抛出ClassNotFoundException,实例:Class cls = Class.forName(“xxx.xxx.Cat”);
应用场景:多用于配置文件,读取类全路径,加载类。
-
前提:若已知具体的类,通过类的class获取,该方式最为安全可靠,程序性能最高。实例:Class cls = Cat.class;
应用场景:多用于参数传递,比如通过反射得到对应构造器对象。
-
前提:已知某个类的实例,调用该实例的getClass()方法获取Class对象。实例:Class cls = 对象.getClass();
应用场景:通过创建好的对象,获取Class对象。
-
通过类加载器得到Class对象
Car car = new Car(); ClassLoader classLoader = car.getClass().getClassLoader(); Class cls = classLoader.loadClass("类的全类名");
-
基本数据类型(int、char、boolean、double等)按如下方式得到Class对象:Class cls = 基本数据类型.class;
-
基本数据类型对应的包装类,可以通过.TYPE得到Class类对象。Class cls = 包装类.TYPE;