Class 存放着对应类型的运行时信息。在 Java 程序运行时,Java 虚拟机为所有类型维护一个 java.lang.Class 对象。该 Class 对象存放着所有关于该对象的运行时信息。
获取 Class那我们如何获取想要的 Class,look this Code
public static void main(String[] args) {// 方式1:Object.getClass()
// Object 类的 getClass() 方法返回一个 Class 类实例
String name = "不是秃头的小李程序员";
Class<?> classType = name.getClass();
System.out.println("Object.getClass() classType: " + classType);
// 方式2:T.Class
// T 是任意 Java 类型
Class<?> classType2 = String.class;
System.out.println("T.Class classType: " + classType2);
// 方式3:Class.forName
try {
Class<?> classType3 = Class.forName("java.lang.String");
System.out.println("Class.forName classType: " + classType2);
// 根据 className 没有找到类,会抛出 ClassNotFoundException 异常
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
获取 Class 的三种方法
getClass()
T.class
Class.forName
这三种用法需要根据具体的场景灵活去使用,比如 JDBC 获取连接的数据库类型,就通过 Class.forName(“类路径”)。
获取父类 Class通过 getSuperclass() 方法获取父类的 Class,示例如下:
Class<?> superclass = Integer.class.getSuperclass();System.out.println(superclass);
System.out.println(superclass.getSuperclass());
System.out.println(superclass.getSuperclass().getSuperclass());
System.out.println(superclass.getSuperclass().getSuperclass().getSuperclass());
运行结果
class java.lang.Numberclass java.lang.Object
null
Exception in thread "main" java.lang.NullPointerException
可以看到 Integer 的父类是 Number,Number 的父类是 Object,Object 就没有父类了,所以在 null 之后会抛出空指针的异常。
小结获取到想要的 Class 了,就可以获取到它的一切信息。
在获取想要的信息前,不妨先了解个知识点。
方法中带与不带「Declared」的区别
不带「Declared」的方法支持取出包括继承、公有(public)的 Field、Method 和 Constructor。
带「Declared」的方法支持取出包括当前类所有的构造函数(包括公有和私有的,不包括继承)的 Field、Method 和 Constructor。
Field 获取 Field如何通过 Class 实例获取字段信息。Class 类提供了以下几个方法来获取字段:
Field getField(String name):根据字段名获取某个 public 的 field
Field[] getFields():获取所有 public 的 field
Field getDeclaredField(String name):根据字段名获取当前类的某个 field
Field[] getDeclaredFields():获取当前类的所有 field
快快快,show me code
public class FiledTest1 {public static void main(String[] args) throws NoSuchFieldException {
Class stdClass = Student.class;
// 获取 public 字段 "score"
System.out.println(stdClass.getField("score"));
// 获取继续的 public 字段 "name"
System.out.println(stdClass.getField("name"));
// 获取 private 字段 "grade"
System.out.println(stdClass.getDeclaredField("grade"));
}
}
class Student extends Person{
public int score;
private int grade;
}
class Person{
public String name;
}