美文网首页
Java反射(一)之Class类

Java反射(一)之Class类

作者: 12313凯皇 | 来源:发表于2019-03-31 11:09 被阅读0次

一、反射

在开始之前,有必要先简单的介绍一下Java的反射(reflective)。
能够分析类能力的程序称为反射,反射是一种功能强大且复杂的机制,它可以用来:

  • 在运行时分析类的能力
  • 在运行时查看对象,例如,编写一个toString方法供所有类使用。
  • 实现通用的数组操作代码
  • 利用Method对象,这个对象很像C++中的函数指针。

上面已经说到了,Java反射强大而复杂,所以本文仅针对其中的一小部分Class类进行讲解。

二、Class类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个消息追踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。而我们可以通过专门的Java类访问这些信息。

保存这些信息的类被称为Class,我们可以通过object.getClass()方法获取到Class类型的实例

String s = "test";
Class c1 = s.getClass();
System.out.println(c1.getName());

最常用的Class方法是getName(),这个方法将返回类的名字,如果这个类在一个包中,那么包的名字也会作为类型的一部分,在上面的例子中,它的输出结果就是:java.lang.String
除了上述获取Class实例的方法外,还有另外两种方法

  • 通过Object.class
Class c2 = String.class;
  • 通过Class.forName(),但是这个方法可能会抛出一个ClassNotFoundException 异常,我们需要把它处理掉:
try {
   Class c3 = Class.forName("java.lang.String");
} catch (ClassNotFoundException e) {>
   e.printStackTrace();
}

注释:这里的Class类实际上是一个泛型类。例如,String.class的类型是Class<String>。没有说明这个问题的原因是:它将已经抽象的概念更加复杂化了。在大多数实际问题中,可以忽略类型参数而使用原始的Class类。

另外,我们还可以通过class.newInstance()方法来创建一个新的实例

Class class1 = String.class;
try {
    String s = (String) class1.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}

上述方法在JDk 1.9及以后被标记为已过时了,替代方法是通过getDeclaredConstructor().newInstance()方法创建实例:

try {
    String s2 = class1.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
    e.printStackTrace();
}

三、总结

获取Class对象实例有三种方法

//方法1
String s = "test";
Class c1 = s.getClass();
System.out.println(c1.getName());

//方法2
Class c2 = String.class;

//方法3
Class c3 = Class.forName("java.lang.String");

通过Class构造一个这个构造器所属类的新实例

Class<String> class1 = String.class;
try {
    //jdk 1.9 之前  1.9之后过时
    String s = class1.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
    e.printStackTrace();
}


try {
    //jdk 1.9之后替代上面的方法
    String s2 = class1.getDeclaredConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
    e.printStackTrace();
}

相关文章

  • Java基础之反射

    Java-Reflect Class类的使用 方法的反射 成员变量的反射 构造函数的反射 Java类加载机制 一、...

  • Java学习之反射

    一、Class 1、概述: 1、Class是Java程序中各个Java类的总称;它是反射的基石,通过Class类来...

  • [JAVA学习笔记] 反射机制

    [JAVA学习笔记] 反射机制 Java的反射通过Class类和java.lang.reflect类库实现。通过它...

  • Class类

    什么是Class类 Class类是java.lang包中的类,是java反射中的一个特别重要的类,因为Class类...

  • Java反射(一)之Class类

    一、反射 在开始之前,有必要先简单的介绍一下Java的反射(reflective)。能够分析类能力的程序称为反射,...

  • 黑马程序员-反射

    反射 1.Class类 Class类:Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是...

  • JAVA高级(9)—— 反射

    反射的基石-Class类 Java程序中的各个Java类属于同一类事物,描述这类事物的Java类名就是Class。...

  • java 反射

    java 反射 Class 类介绍 以下所有大写的 Class 都表示 java.lang.Class 1.jav...

  • Java反射由浅入深

    分享一下学习反射的笔记,了解反射之前要先了解一下java的class类。 1. Class类 Java除了基本类型...

  • java反射

    反射 反射就是把Java类中的各种成分映射成相应的java类。例如,一个java类中用一个Class类的对象来表示...

网友评论

      本文标题:Java反射(一)之Class类

      本文链接:https://www.haomeiwen.com/subject/tnjybqtx.html