本文将演示Class类常用方法
public Class asSubclass(Class clazz)
从名字上看似是将调用的Class转成括号内的Class的子类,但正好是反的这个方法的作用是:父类Class对象作为参数,将父类转化为子类Class对象
示例4:
packagestring.lang.java;
classA{
publicString toString() {
return"A类对象";
}
}
classB1extendsA{
publicString toString() {
return"B1类对象";
}
}
classB2extendsA{
publicString toString() {
return"B2类对象";
}
}
publicclassClassDemo4 {
publicstaticvoidmain(String[]args) {
try{
Classc=B1.class;
Classb1=c.asSubclass(A.class);
System.out.println(b1.newInstance());
}catch(InstantiationExceptione) {
//TODOAuto-generated catch block
e.printStackTrace();
}catch(IllegalAccessExceptione) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
}
运行的结果如下:
说明:
上例中的Classc=B1.class;
Classb1=c.asSubclass(A.class);
将B1的Class对象转换成父类A的Class对象意义不大。但若c是通过Class.formName加载而成那未必可以转换,因此该方法的意义就是检测加载的class对象是否与目标类型的Class兼容,如果转换成功表示兼容,否则抛出异常
示例5:
packagestring.lang.java;
publicclassClassDemo5 {
publicstaticvoidmain(String[]args) {
try{
Classc1= Class.forName("string.lang.java.B1");//1
Classb1=c1.asSubclass(A.class);//2
Classc2= Class.forName("string.lang.java.B2");//3
Classb2=c2.asSubclass(A.class);//4
Classb3=c2.asSubclass(B1.class);//5
}catch(ClassNotFoundExceptione) {
//TODOAuto-generated catch block
e.printStackTrace();
}
}
}
运行的结果如下:
说明:异常在注释5处,原因就是无法将B2类型class对象转换成B1类型的Class对象