一、反射
在开始之前,有必要先简单的介绍一下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();
}
网友评论