繁体   English   中英

反射API,Class.forName()与.class

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM