如何让用户插入字符串并检查具有相同“名称”的类?
想象一下,我有一个标记为public A[] getB(String bString)
的方法和两个类A
和B
,其中B extends A
。
在这种方法中,我想搜索现有的A[]
,以查找来自class B
和 向上的对象使用所述对象返回 A[]
。
我在互联网上搜索过,发现班级Class
的方法为forName()
,但我真的不明白如何使用它。例如,我这样做:
Class<?> cl = Class.forName(bString);
其中bString
是包含String
的{{1}},B
是另一个类。
我的问题是:
现在对象“cl”究竟是什么?
我现在如何检查对象是否与它属于同一类?
答案 0 :(得分:1)
究竟是什么对象&#34; cl&#34;现在?
cl
是Class
类的实例。
我现在如何检查对象是否与它属于同一类?
您有2个对象o1
和o2
您可以使用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();
您可以使用每个对象具有的getClass
(documentation)方法检查两个对象是否属于同一个类:
if (first.getClass().equals(second.getClass()) {
// Same
} else {
// Different
}
但请注意,此比较严格。如果您比较false
和Integer
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();
}