本文將演示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對象