gpt4 book ai didi

java - Class.isAssignableFrom 在某些情况下会给出错误的结果

转载 作者:行者123 更新时间:2023-12-02 04:52:42 28 4
gpt4 key购买 nike

我真的对这种行为感到困惑。在 JBoss 7 中,我使用 @Entity 注释检索所有类,然后我需要找到所有实现接口(interface)“BusinessObject”的类。

这是实现它的方法:

     private Set<Class<? extends BusinessObject>> findEntityClasses() {
// Alle Klassen holen, die mit "@Entity" annotiert sind. Dabei werden Hibernate- wie auch javax.persistence Annotations genommen
Reflections reflections = new Reflections("de.something.b4");
Set<Class<?>> entityClasses = reflections.getTypesAnnotatedWith(Entity.class);

//Jetzt in das finale Set nur die Klassen kopieren, die von BusinessObject erben. Weil andere benutzen wir hier nicht!
Set<Class<? extends BusinessObject>> boClasses = new HashSet<Class<? extends BusinessObject>>();
try {
List<Class> l = new ArrayList<Class>(entityClasses);

for (Class currentClass : l) {
//Class newCurrentClass = Class.forName(currentClass.getName());
if (BusinessObject.class.isAssignableFrom(currentClass)) {
boClasses.add(currentClass);
}

}
} catch (Throwable t) {
System.out.println(t.getMessage());
}

return boClasses;
}

请注意带有 Class.forName() 的注释掉的行!

注释掉后,isAssignableFrom 总是 返回真,即使 currentClass 没有实现 BusinessObject。

一旦我删除了对 Class.forName() 的注释并调用了它,这个类就会发生一些事情,以便所有对 isAssignableFrom 的后续调用都按预期返回正确的值。

我确定这是有原因的,Class.forName() 对类或类加载器做了一些事情,但我不知道是什么。有人知道这种行为吗?

最佳答案

引自javadoc Class.forName() 的:

A call to forName("X") causes the class named X to be initialized.

因此,如果您取消注释 Class.forName(currentClass.getName());,它将初始化该类,因此 Class.isAssignableFrom() 将能够正确测试如果 BusinessObject 由类实现(Reflections 可能不会初始化它们)。

关于java - Class.isAssignableFrom 在某些情况下会给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26398105/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com