本文將演示Class類常用方法
public Class asSubclass(Class clazz)
從名字上看似是將調(diào)用的Class轉(zhuǎn)成括號內(nèi)的Class的子類聋庵,但正好是反的這個方法的作用是:父類Class對象作為參數(shù),將父類轉(zhuǎn)化為子類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();
}
}
}
運行的結(jié)果如下:
說明:
上例中的Classc=B1.class;
Classb1=c.asSubclass(A.class);
將B1的Class對象轉(zhuǎn)換成父類A的Class對象意義不大郎汪。但若c是通過Class.formName加載而成那未必可以轉(zhuǎn)換价卤,因此該方法的意義就是檢測加載的class對象是否與目標(biāo)類型的Class兼容劝萤,如果轉(zhuǎn)換成功表示兼容,否則拋出異常
示例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();
}
}
}
運行的結(jié)果如下:
說明:異常在注釋5處慎璧,原因就是無法將B2類型class對象轉(zhuǎn)換成B1類型的Class對象