Java反射-获取一个class的Class实例

​ 方法一:直接通过一个class的静态变量class获取: `Class cls = String.class;` 方法二:如果我们有一个实例变量,可以通过该实例变量提供的getClass()方法获取: ``` String s = "Hello"; Class cls = s.getClass(); ``` 方法三:如果知道一个class的完整类名,可以通过静态方法Class.forName()获取: ```Class cls = Class.forName("java.lang.String");``` 因为Class实例在JVM中是唯一的,所以,上述方法获取的Class实例是同一个实例。可以用==比较两个Class实例: ``` Class cls1 = String.class; String s = "Hello"; Class cls2 = s.getClass(); boolean sameClass = cls1 == cls2; // true ``` 用instanceof不但匹配指定类型,还匹配指定类型的子类。而用==判断class实例可以精确地判断数据类型,但不能作子类型比较。 通常情况下,我们应该用instanceof判断数据类型,因为面向抽象编程的时候,我们不关心具体的子类型。只有在需要精确判断一个类型是不是某个class的时候,我们才使用==判断class实例。 因为反射的目的是为了获得某个实例的信息。因此,当我们拿到某个Object实例时,我们可以通过反射获取该Object的class信息: ` void printObjectInfo(Object obj) { Class cls = obj.getClass(); } ` 要从Class实例获取获取的基本信息,参考下面的代码: ` public class Main { public static void main(String[] args) { printClassInfo("".getClass()); printClassInfo(Runnable.class); printClassInfo(java.time.Month.class); printClassInfo(String[].class); printClassInfo(int.class); } static void printClassInfo(Class cls) { System.out.println("Class name: " + cls.getName()); System.out.println("Simple name: " + cls.getSimpleName()); if (cls.getPackage() != null) { System.out.println("Package name: " + cls.getPackage().getName()); } System.out.println("is interface: " + cls.isInterface()); System.out.println("is enum: " + cls.isEnum()); System.out.println("is array: " + cls.isArray()); System.out.println("is primitive: " + cls.isPrimitive()); } } `
posted @ 2021-11-02 15:25  西门长海  阅读(140)  评论(0编辑  收藏  举报