[英]Reflection API, Class.forName() vs .class
interface A {
}
public class B {
public static void main(String a[]) {
Class c = Class.forName("A");
System.out.println(c.isInterface());//false
Class c1 = A.class;
System.out.println(c1.isInterface());//true
}
}
o / p:否是
期望o / p:true true
我将不知道这两者之间的区别:Class.forName(“ A”)和A.class非常感谢。
Class.forName()
尝试使用默认的类加载器在运行时解析类。 它可能成功,也可能失败,具体取决于所需的类是否有效以及您的类路径中是否存在。
.class
运算符将类描述符评估为编译时常量。 如果引用的类无效并且存在于类路径中,则它在运行时仍然会失败,但是它可以在需要常量表达式的地方使用(例如,在注释值中),并且通常在重构方面更具弹性。 注意,捕获的类描述符取决于编译器的输入和类路径。 如果使用不同的编译器参数,则相同的代码最终可能会引用两个不同的类。
在您的用例中,两者都应解析为同一类。 您的结果是意外的,并且可能表明您的类路径中存在另一个名为A
的类。 我怀疑您在问题中引用的接口A
实际上位于包中,在这种情况下,您将错误的描述符传递给forName()
。 该名称应符合包装要求。
如果编写A.class
则编译器需要在编译时知道A。
如果编写Class.forName("A")
,则仅在运行时需要。
它通过尝试捕获或抛出java给Runtime error
包围
做到这一点,成为true true
interface A{
}
public class B{
public static void main(String a[]) throws ClassNotFoundException{
Class c= Class.forName("A");
System.out.println(c.isInterface());
Class c1=A.class;
System.out.println(c1.isInterface());
}
}
输出量
true
true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.