如何在Java中确定集合中的类?

如何在Java中确定集合中的类?,java,Java,如何判断集合中的类类型?我需要以不同于复杂类型的方式处理简单数据类型,因此我必须了解包含的类。目前,我必须遍历集合以找出听起来不正确的类。这很有帮助,但没有完全解决我的问题。基本上,以下是问题: 1.如何确定集合中的类? 2.如何判断对象是java包装类(整数、字符串、日期等)还是专有类(学生、车辆等) 多谢各位 贾巴瓦巴 entity=newsomeobject(); 类entityClass=entity.getClass(); 对于(方法:entityClass.getDeclaredMe

如何判断集合中的类类型?我需要以不同于复杂类型的方式处理简单数据类型,因此我必须了解包含的类。目前,我必须遍历集合以找出听起来不正确的类。这很有帮助,但没有完全解决我的问题。基本上,以下是问题: 1.如何确定集合中的类? 2.如何判断对象是java包装类(整数、字符串、日期等)还是专有类(学生、车辆等)

多谢各位 贾巴瓦巴

entity=newsomeobject();
类entityClass=entity.getClass();
对于(方法:entityClass.getDeclaredMethods()){
类returnType=method.getReturnType();
if(returnType!=null){
if(returnType.isPrimitive()| |(returnType.getName().startsWith(“java.lang.”))| |(returnType==java.util.Date.class)){
//处理基本类和包装类
handleScalar(方法);
}else if(Collection.class.isAssignableFrom(returnType)){
集合集合=(集合)方法。调用(实体);
if(collection==null | | collection.isEmpty()){
继续;
}
for(对象值:集合){
if(value.getClass().getName().startsWith(“java.lang.”)| |(value.getClass()=java.util.Date.class)){
手持执行器(方法);
//不需要遍历所有简单的值
继续;
}否则{
//每个“值”本身就是一个复杂的对象。
handleComplexObject(方法);
}
}
}如果(){
//做与上面类似的事情。
}
}
}
无法在运行时确定未知集合的类型参数。JVM在运行时并不保存这些信息。

您无法在运行时确定未知集合的类型参数。JVM在运行时根本不保存这些信息。

1)如果它不是泛型集合,就不能保存。非类型集合可以包含任何对象类型的混合

如果处理的是(非空)类型的集合,则可以在运行时确定其内容的类别,例如

Collection<?> coll = ...
if (coll.isEmpty())
    throw new BadLuckException();
Object representative = coll.iterator().next();
Class<?> typeOfContent = representative.getClass();
//apply your cases on this Class object
但是,每个包装器类都声明了一个名为“TYPE”的字段,该字段表示它所包装的基本类。因此,您可以检查一个类是否是如下所示的包装类:

public static boolean isWrapperClass(Class<?> clazz) {
    try {
        clazz.getDeclaredField("TYPE");
        return true;
    catch (NoSuchFieldException ex) {
        return false;
    }
}
if(s instanceof java.lang.String)
{

}
公共静态布尔isWrapperClass(类clazz){
试一试{
clazz.getDeclaredField(“类型”);
返回true;
捕获(NoSuchFieldException-ex){
返回false;
}
}
1)如果不是泛型集合,则不能使用。非类型集合可以包含任何对象类型的混合

如果处理的是(非空)类型的集合,则可以在运行时确定其内容的类别,例如

Collection<?> coll = ...
if (coll.isEmpty())
    throw new BadLuckException();
Object representative = coll.iterator().next();
Class<?> typeOfContent = representative.getClass();
//apply your cases on this Class object
但是,每个包装类都声明了一个名为“TYPE”的字段,该字段表示它所包装的基本类。因此,您可以检查一个类是否是这样的包装类:

public static boolean isWrapperClass(Class<?> clazz) {
    try {
        clazz.getDeclaredField("TYPE");
        return true;
    catch (NoSuchFieldException ex) {
        return false;
    }
}
if(s instanceof java.lang.String)
{

}
公共静态布尔isWrapperClass(类clazz){
试一试{
clazz.getDeclaredField(“类型”);
返回true;
捕获(NoSuchFieldException-ex){
返回false;
}
}

我想你可以像这样使用instanceof关键字:

public static boolean isWrapperClass(Class<?> clazz) {
    try {
        clazz.getDeclaredField("TYPE");
        return true;
    catch (NoSuchFieldException ex) {
        return false;
    }
}
if(s instanceof java.lang.String)
{

}

我想你可以像这样使用instanceof关键字:

public static boolean isWrapperClass(Class<?> clazz) {
    try {
        clazz.getDeclaredField("TYPE");
        return true;
    catch (NoSuchFieldException ex) {
        return false;
    }
}
if(s instanceof java.lang.String)
{

}

为什么你就不能这么做呢

Collection c = new ArrayList();
c.add("Hi");
Iterator i = c.iterator();
Object v = i.hasNext()? i.next() : null;
if(v != null) {
    System.out.println(v.getClass().getName());
}
更新:

假设它是一个同质的集合。希望我正确地理解了您的问题。

为什么您不能这样做

Collection c = new ArrayList();
c.add("Hi");
Iterator i = c.iterator();
Object v = i.hasNext()? i.next() : null;
if(v != null) {
    System.out.println(v.getClass().getName());
}
更新:


假设它是一个同质集合。希望我正确理解了您的问题。

查看您的示例(整数、字符串、日期等),我只需创建一个集合,其中包含您希望以不同方式处理的所有类型,然后只需检查值类型是否在此集合中。您仍然需要通过集合元素进行迭代,或者假设集合的所有元素都属于同一类型。

查看您的示例(整数、字符串、日期等),我只需创建一个集合,其中包含您希望以不同方式处理的所有类型,然后只需检查值类型是否在此集合中。您仍然必须通过集合元素进行迭代,或者假设集合的所有元素都是同一类型。

这需要检查您要查找的每个案例,因此可能不实用,但必须迭代通过集合项,这正是我试图避免的。或者它可能正是你试图避免的…我的错!这需要检查你正在寻找的每个案例,虽然它可能不实用,但我必须迭代通过集合项,这正是我试图避免的。或者它可能正是我想要的您正在试图避免…我的错!我已经在示例代码中这样做了。我不想迭代泛型集合以找出包含的类类型。我已经在示例代码中这样做了。我不想迭代泛型集合以找出包含的类类型。当然可以。您可以在ny对象。我认为您的意思是泛型类型。这部分是正确的。您可以检测集合本身的已擦除类型,但无法获取其泛型类型参数(注意答案中的单词?)。您可以尝试查看元素本身,但如果没有元素或元素都为null,则您将无法了解。当然可以。您可以对任何对象执行getClass。我认为您的意思是泛型类型。这部分是正确的。您可以检测集合本身的已擦除类型,但无法获取其泛型键入参数(注意答案中的那个词吗?)。你可以尝试查看元素本身,但如果没有或它们都是空的,那你就不知道了