我正在编写一些适用于JMX api的代码。具体来说,我正在使用getAttribute
MBeanServerConnection
方法
getAttribute
方法的javadocs表示它返回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,我必须使用它。
欣赏有关如何解决这个问题的想法或想法?
干杯
森
答案 0 :(得分:1)
if (o instanceof int[]) {
...
}
else if (o instanceof boolean[]) {
...
}
...
也许有一些更优雅的解决方案,但你不知道你想用该属性做什么。
答案 1 :(得分: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("---");
}
}