本文将演示Class类常用方法
public <U> Class<? extends U> asSubclass(Class<U> clazz) |
从名字上看似是将调用的Class转成括号内的Class的子类,但正好是反的这个方法的作用是:父类Class对象作为参数,将父类转化为子类Class对象 |
示例4:
package string.lang.java;
class A{ public String toString() { return "A类对象"; } } class B1 extends A{ public String toString() { return "B1类对象"; } } class B2 extends A{ public String toString() { return "B2类对象"; } } public class ClassDemo4 { public static void main(String[] args) { try { Class<B1> c=B1.class; Class b1=c.asSubclass(A.class); System.out.println(b1.newInstance()); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
|
运行的结果如下:
说明:
上例中的Class<B1> c=B1.class;
Class b1=c.asSubclass(A.class);
将B1的Class对象转换成父类A的Class对象意义不大。但若c是通过Class.formName加载而成那未必可以转换,因此该方法的意义就是检测加载的class对象是否与目标类型的Class兼容,如果转换成功表示兼容,否则抛出异常
示例5:
package string.lang.java;
public class ClassDemo5 { public static void main(String[] args) { try { Class c1 = Class.forName("string.lang.java.B1"); //1 Class b1 = c1.asSubclass(A.class); //2 Class c2 = Class.forName("string.lang.java.B2");//3 Class b2 = c2.asSubclass(A.class); //4 Class b3 = c2.asSubclass(B1.class); //5 } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
|
运行的结果如下:
说明:异常在注释5处,原因就是无法将B2类型class对象转换成B1类型的Class对象