关于类方法“forName()”的问题

时间:2017-10-13 17:32:02

标签: java class

如何让用户插入字符串并检查具有相同“名称”的类?

想象一下,我有一个标记为public A[] getB(String bString)的方法和两个类AB,其中B extends A

在这种方法中,我想搜索现有的A[],以查找来自class B 向上的对象使用所述对象返回 A[]

我在互联网上搜索过,发现班级Class的方法为forName(),但我真的不明白如何使用它。例如,我这样做:

Class<?> cl = Class.forName(bString);

其中bString是包含String的{​​{1}},B另一个类

我的问题是:

  • 现在对象“cl”究竟是什么?

  • 我现在如何检查对象是否与它属于同一类?

3 个答案:

答案 0 :(得分:1)

  

究竟是什么对象&#34; cl&#34;现在?

clClass类的实例。

  

我现在如何检查对象是否与它属于同一类?

您有2个对象o1o2您可以使用getClass()

o1 != null && o2 != null && o1.getClass().equals(o2.getClass())

答案 1 :(得分:1)

方法Class.forName(String)返回相应类的Class对象(如果已知)。引用其documentation

  

返回与给定字符串Class的类或接口关联的name对象。

一个例子是:

Class threadClass = Class.forName("java.lang.Thread");

请注意,该类的名称必须完全限定,而不仅仅是Thread,而是java.lang.Thread

如上所述,您获得的对象是相应类的表示。您可以使用它来动态创建实例,检查方法等。这是它的documentation,这是一个例子:

Class<?> threadClass = Class.forName("java.lang.Thread");

// Dynamically create a thread, unchecked cast
Thread thread = (Thread) threadClass.newInstance();

您可以使用每个对象具有的getClassdocumentation)方法检查两个对象是否属于同一个类:

if (first.getClass().equals(second.getClass()) {
    // Same
} else {
    // Different
}

但请注意,此比较严格。如果您比较falseInteger Number,它会抛出Integer extends Number。如果您想要一个不太严格的变体,您可以使用instanceof运算符:

if (first instanceof second) {
    // Is type of
} else {
    // Not type of
}

答案 2 :(得分:1)

你确定不想使用isInstance吗?

你可以改变你的方法来取一个Class而不是一个String,因为那是你真正使用的一个类。

public A[] getB(Class type){
    // I'm assuming you have an array of all As somewhere, called Aarray here
    List<A> BList = new ArrayList<>();
    for(int i = 0; i < Aarray.length; i++){
        if(type.isInstance(Aarray[i])){
            BList.add(Aarray[i]);
        }
    }
    return BList.toArray();
}