1

我正在编写一些适用于 JMX api 的代码。具体来说,我正在使用的getAttribute方法MBeanServerConnection

该方法的javadocsgetAttribute说它返回Object,但我发现取决于MBean,有时它可以返回一个Object,而其他时候它可以返回一个Object[]数组。

因为我想处理getAttribute一致的返回,所以我编写了以下代码:

Object attr = mBeanServer.getAttribute(objName, attributeName);
Object[] attributes = new Object[]{};

if (attr.getClass().isArray()) {
    attributes = (Object[])attr; // create my array by casting the return from getAttribute
} else {
    attributes = new Object[] {attr}; // create my array with just one element
}

for (int i=0; i < attributes.length; i++) {
    // deal with each attribute ...
}

希望你能看到这个想法。这可能是一个幼稚的解决方案,但基本上我想处理getAttribute一致的返回,无论它是单个Object还是Object[]数组。

以上工作......在大多数情况下!...但我现在发现'getAttribute'返回了一个数组long(原语,而不是类)。正因为如此,我的演员抛出了一个java.lang.ClassCastException: [J cannot be cast to [Ljava.lang.Object;

我理解异常 - 它不能将数组long转换为数组Object- 但我不知道如何解决它。

就个人而言,我认为方法签名getAttribute很烂!返回“对象”以涵盖几乎所有内容——一个对象、一个对象数组或一组原语——对我来说就像一个警察。但它不是我的 api,我必须使用它。

感谢我如何解决这个问题的任何想法或想法?

干杯

弥敦道

4

2 回答 2

1
if (o instanceof int[]) {
   ...
}
else if (o instanceof boolean[]) {
   ...
}
...

也许有一些更优雅的解决方案,但你不知道你想用这个属性做什么。

于 2013-01-09T22:03:14.157 回答
1

这个怎么样?

import java.lang.reflect.*;
import java.util.*;

public class ArrayTest
{ 
  public static void main(String[] args)
  {
    evaluate("Hello");
    evaluate(new Boolean[]{Boolean.TRUE, Boolean.FALSE});
    evaluate(new int[]{0, 1, 2});
    evaluate(null);
  }

  public static void evaluate(Object object)
  {
    List<String> primitiveArrayTypes = Arrays.asList(new String[] {
        "boolean[]", "byte[]", "char[]", "double[]",
        "float[]", "int[]", "long[]", "short[]"
    });

    if (object == null)
    {
      System.out.println("Null object.");
      return;
    }

    Class objClass = object.getClass();

    if (objClass.isArray())
    {
      if (primitiveArrayTypes.contains(objClass.getCanonicalName()))
      {
        System.out.println("Contents of primitive array:");
        for (int i = 0; i < Array.getLength(object); i++)
        {
          System.out.println(Array.get(object, i));
        }
      }
      else
      {
        System.out.println("Contents of Object array:");
        for (Object obj : (Object[]) object)  // cast should now always work
        {
          System.out.println(obj);
        }
      }
    }
    else
    {
      System.out.println("Not an array: " + object);
    }
    System.out.println("---");
  }
}
于 2013-01-10T15:59:10.120 回答