Java反射(一)之Class类

2019-03-31  本文已影响0人  12313凯皇

一、反射

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

上面已经说到了,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();
}
上一篇 下一篇

猜你喜欢

热点阅读