cra*_*esh 174 java reflection class
我正在玩Java的反射API并试图处理一些字段.现在我一直在确定我的领域类型.字符串很简单,就是这样myField.getType().equals(String.class).这同样适用于其他非派生类.但是我如何检查派生类?例如LinkedList作为的子类List.我找不到任何isSubclassOf(...)或extends(...)方法.我是否需要getSuperClass()走遍所有人并自己找到我的supeclass?
Sea*_*oyd 372
你想要这个方法:
boolean isList = List.class.isAssignableFrom(myClass);
Run Code Online (Sandbox Code Playgroud)
一般情况下,List(上述)应替换为,superclass并myClass应替换为subclass
来自JavaDoc:
确定此
Class对象表示的类或接口是否与指定Class参数表示的类或接口相同,或者是它们的超类或超接口.它返回,true如果是这样; 否则它会返回false.如果此Class对象表示基本类型,则此方法返回true指定Class参数是否恰好是此Class对象; 否则它会返回false.
参考:
有关:
a)检查Object是否是编译时知道的类或接口(包括子类)的实例:
boolean isInstance = someObject instanceof SomeTypeOrInterface;
Run Code Online (Sandbox Code Playgroud)
例:
assertTrue(Arrays.asList("a", "b", "c") instanceof List<?>);
Run Code Online (Sandbox Code Playgroud)
b)检查Object是否是您在运行时只知道的类或接口(包括子类)的实例:
Class<?> typeOrInterface = // acquire class somehow
boolean isInstance = typeOrInterface.isInstance(someObject);
Run Code Online (Sandbox Code Playgroud)
例:
public boolean checkForType(Object candidate, Class<?> type){
return type.isInstance(candidate);
}
Run Code Online (Sandbox Code Playgroud)
Lan*_*dei 23
另一种选择是instanceof:
Object o =...
if (o instanceof Number) {
double d = ((Number)o).doubleValue(); //this cast is safe
}
Run Code Online (Sandbox Code Playgroud)
instanceof适用于实例,即对象.有时你想直接与班级一起工作.在这种情况下,您可以使用Class类的asSubClass方法.一些例子:
1)
Class o=Object.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)
这将顺利进行,因为JFrame是Object的子类.c将包含一个表示JFrame类的Class对象.
2)
Class o=JButton.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)
这将启动java.lang.ClassCastException,因为JFrame不是JButton的子类.c不会被初始化.
3)
Class o=Serializable.class;
Class c=Class.forName("javax.swing.JFrame").asSubclass(o);
Run Code Online (Sandbox Code Playgroud)
这将顺利进行,因为JFrame实现了java.io.Serializable接口.c将包含一个表示JFrame类的Class对象.
当然,必须包括所需的进口.
这对我有用:
protected boolean isTypeOf(String myClass, Class<?> superClass) {
boolean isSubclassOf = false;
try {
Class<?> clazz = Class.forName(myClass);
if (!clazz.equals(superClass)) {
clazz = clazz.getSuperclass();
isSubclassOf = isTypeOf(clazz.getName(), superClass);
} else {
isSubclassOf = true;
}
} catch(ClassNotFoundException e) {
/* Ignore */
}
return isSubclassOf;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
121741 次 |
| 最近记录: |