1

JMX API で動作するコードを書いています。具体的にはのgetAttribute方法を利用していますMBeanServerConnection

このメソッドのjavadocsには、 が返されると書かれていますが、私が見つけたのは、MBean によっては、 を返すこともあれば、配列を返すこともあるということです。getAttributeObjectObjectObject[]

からのリターンを一貫して処理したいので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おそらく単純な解決策ですが、基本的には、単一ObjectObject[]配列かに関係なく、一貫してからの戻り値を処理したいと考えています。

上記は機能します...ほとんどの場合!...しかし、「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 に答える