我有由来自DB的进口不同的元素,组成的字符串,数字,双打和INTS的ArrayList的。 有没有办法使用反射型技术,找出每类元素保存的数据有什么办法?
FYI:之所以有这么多类型的数据是,这是被写入一块Java代码与不同的数据库的实现。
我有由来自DB的进口不同的元素,组成的字符串,数字,双打和INTS的ArrayList的。 有没有办法使用反射型技术,找出每类元素保存的数据有什么办法?
FYI:之所以有这么多类型的数据是,这是被写入一块Java代码与不同的数据库的实现。
在C#:
从推荐固定麦克
ArrayList list = ...;
// List<object> list = ...;
foreach (object o in list) {
if (o is int) {
HandleInt((int)o);
}
else if (o is string) {
HandleString((string)o);
}
...
}
在Java:
ArrayList<Object> list = ...;
for (Object o : list) {
if (o instanceof Integer)) {
handleInt((int)o);
}
else if (o instanceof String)) {
handleString((String)o);
}
...
}
您可以使用getClass()
方法,或者你可以使用的instanceof。 例如
for (Object obj : list) {
if (obj instanceof String) {
...
}
}
要么
for (Object obj : list) {
if (obj.getClass().equals(String.class)) {
...
}
}
需要注意的是的instanceof将匹配的子类。 例如,的C
是的一个子类A
,那么下面将真:
C c = new C();
assert c instanceof A;
然而,以下将是错误的:
C c = new C();
assert !c.getClass().equals(A.class)
for (Object object : list) {
System.out.println(object.getClass().getName());
}
你几乎从来不希望你使用这样的:
Object o = ...
if (o.getClass().equals(Foo.class)) {
...
}
因为你不占可能的子类。 你真的想使用Class#isAssignableFrom:
Object o = ...
if (Foo.class.isAssignableFrom(o)) {
...
}
在Java中只使用instanceof运算符。 这也将采取子类的照顾。
ArrayList<Object> listOfObjects = new ArrayList<Object>();
for(Object obj: listOfObjects){
if(obj instanceof String){
}else if(obj instanceof Integer){
}etc...
}
import java.util.ArrayList;
/**
* @author potter
*
*/
public class storeAny {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<Object> anyTy=new ArrayList<Object>();
anyTy.add(new Integer(1));
anyTy.add(new String("Jesus"));
anyTy.add(new Double(12.88));
anyTy.add(new Double(12.89));
anyTy.add(new Double(12.84));
anyTy.add(new Double(12.82));
for (Object o : anyTy) {
if(o instanceof String){
System.out.println(o.toString());
} else if(o instanceof Integer) {
System.out.println(o.toString());
} else if(o instanceof Double) {
System.out.println(o.toString());
}
}
}
}
只需拨打.getClass()
上的每个Object
在一个循环。
不幸的是,Java没有map()
:)
INSTANCEOF工作,如果你不依赖于特定的类,但也请记住,你可以在列表中的空值,所以obj.getClass()会失败,但总的instanceof上返回空假。
由于Java 8
mixedArrayList.forEach((o) -> { String type = o.getClass().getSimpleName(); switch (type) { case "String": // treat as a String break; case "Integer": // treat as an int break; case "Double": // treat as a double break; ... default: // whatever } });
而不是使用object.getClass().getName()
您可以使用object.getClass().getSimpleName()
因为它返回一个简单的类名,不包括包的名称。
例如,
Object[] intArray = { 1 };
for (Object object : intArray) {
System.out.println(object.getClass().getName());
System.out.println(object.getClass().getSimpleName());
}
给,
java.lang.Integer
Integer
你说:“这是一块java代码被写入”,从中我推断,还有,你可以设计一个不同方式的机会。
有一个ArrayList就像有东西的集合。 而不是强制的instanceof或的getClass每次你把一个对象从列表中的时候,为什么不设计系统,让你当你从数据库中检索获取对象的类型,并将其存储到相应类型的集合宾语?
或者,你可以用它存在为你做这个的很多数据访问库之一。
如果你希望数据是在某种形式的数字,和你有兴趣做的结果转换为数值,我建议:
for (Object o:list) {
Double.parseDouble(o.toString);
}