如何在Java中确定集合内部的Class类型?

15 浏览
0 Comments

如何在Java中确定集合内部的Class类型?

我如何确定集合中包含的类的类型?我需要分别处理简单数据类型和复杂类型,因此我必须了解包含的类。目前,我必须遍历集合以找到类,这听起来不太对。这个链接非常有帮助,但没有完全解决我的问题。基本上,以下是问题:\n1. 如何确定集合中的类?\n2. 如何判断对象是Java包装类(Integer、String、Date等)还是专有类(Student、Vehicle等)。\n谢谢\nJabawaba\n

entity = new SomeObject();
Class entityClass = entity.getClass();
for (Method method : entityClass.getDeclaredMethods()) {
  Class returnType = method.getReturnType();
  if (returnType != null) {
    if (returnType.isPrimitive() || (returnType.getName().startsWith("java.lang.")) || (returnType == java.util.Date.class)) {
      // 处理原始类型和包装类
      handleScalar(method);
    } else if (Collection.class.isAssignableFrom(returnType)) {
      Collection collection = (Collection) method.invoke(entity);
      if (collection == null || collection.isEmpty()) {
        continue;
      }
      for (Object value : collection) {
        if (value.getClass().getName().startsWith("java.lang.") || (value.getClass() == java.util.Date.class)) {
          handleSimpleVector(method);
          // 不需要遍历所有简单值
          continue;
        } else {
          // 每个'value'本身都是一个复杂对象。
          handleComplexObject(method);
        }
      }
    } else if (){
      // 做与上面类似的操作。
    }
  }
}

0
0 Comments

在Java中,有时候我们需要确定一个集合中的元素的类型。例如,在处理一个集合时,我们可能想对不同类型的元素采取不同的操作。那么,如何确定集合中的元素类型呢?

在你的例子中(Integer、String、Date等),我会简单地创建一个包含所有要单独处理的类型的Set,并且只需检查值的类型是否在这个Set中即可。你仍然需要遍历集合元素,或者假设集合的所有元素都是相同的类型。

代码示例:

Set> specialTypes = new HashSet<>();
specialTypes.add(Integer.class);
specialTypes.add(String.class);
specialTypes.add(Date.class);
for (Object element : collection) {
    if (specialTypes.contains(element.getClass())) {
        // 处理特殊类型的元素
    } else {
        // 处理其他类型的元素
    }
}

在上面的代码中,我们创建了一个特殊类型的Set,并将要处理的类型添加到Set中。然后,我们遍历集合中的元素,使用getClass()方法获取元素的类型,并检查该类型是否在特殊类型的Set中。如果是,则执行特殊类型的处理逻辑;否则,执行其他类型的处理逻辑。

通过这种方法,我们可以确定集合中元素的类型,并对不同类型的元素采取不同的操作。

0
0 Comments

问题:如何确定Java中集合中的类?

在上述代码中,我们尝试使用迭代器来获取集合中的元素,并通过获取元素的类名来确定集合中元素的类。然而,这种方法并不可行,因为我们无法通过这种方式直接获取集合中元素的类。

解决方法:通过使用泛型来解决这个问题。通过在创建集合时指定元素的类型,我们可以在编译时确定集合中元素的类。下面是修改后的代码:

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

这样,我们就可以在编译时确定集合中元素的类,而不需要在运行时通过迭代器来获取。

0
0 Comments

在Java中,要确定集合中的类,有两个问题需要解决:1) 如果集合没有泛型类型,是无法确定类的。非类型化的集合可以包含任意混合的对象类型。2) 如果集合是有类型的,可以在运行时确定其内容的类。

对于第一个问题,如果集合是非空的且有类型的,可以通过以下方法在运行时确定其内容的类:

Collection coll = ...
if (coll.isEmpty())
    throw new BadLuckException();
Object representative = coll.iterator().next();
Class typeOfContent = representative.getClass();
//apply your cases on this Class object

因为泛型类型是纯粹的编译时信息,所以没有其他方法可以在运行时确定泛型类型信息。

对于第二个问题,要确定类是否是原始类,可以使用Class#isPrimitive方法。但需要注意的是,这只能确定一个对象是否真的是原始类,而不能确定是否处理的是自动装箱的值。每个包装类都声明了一个名为"TYPE"的字段,该字段表示它所包装的原始类。因此,可以通过以下方法确定一个类是否是包装类:

public static boolean isWrapperClass(Class clazz) {
    try {
        clazz.getDeclaredField("TYPE");
        return true;
    catch (NoSuchFieldException ex) {
        return false;
    }
}

感谢确认我的猜想。除了上面显示的丑陋的方法之外,有没有更优雅的方法来确定包装类/原始类与非标准类?

请查看我的编辑 - 恐怕除了显式比较类之外,没有其他方法。

0