2

次のようにjmxを使用してJavaクラスでメソッドを呼び出すことができることを私は知っています:

try {   JMXServiceURL serviceUrl = new JMXServiceURL(URL);
        jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);           
        ObjectName objectName = new ObjectName("whatever");
        MBeanServerConnection mbeanConn = jmxConnector.getMBeanServerConnection();      
        ret = (String)mbeanConn.invoke(objectName, methodName, paramsForInvoke, signitureForInvoke);
    }

パラメーターを指定してメソッドを呼び出したい場合は、実際のパラメーターを Object 配列として渡し、パラメーターの型を String 配列として渡す必要があります。上記の例を続けて、sList という String ArrayList を渡したいとします。

ArrayList<String> sList = new ArrayList<String>();
sList.add("kapd_be");
Object  paramsForInvoke[] = {sList};
String  signitureForInvoke[] = {ArrayList.class.getName()};

この場合、すべてが正常に機能し、メソッドは適切なパラメーターで呼び出されます。そして、呼び出されたメソッドで「kapd_be」文字列を抽出できます。

しかし、パラメーターを他のクラスの ArrayList にしたい場合は、SortInfo としましょう (これは私が作成した POJO クラスで、いくつかのフィールドが含まれています)。コードは実行されず、メソッドを呼び出すことさえできないため、明らかにいいえパラメータを抽出できます。唯一の違いはこれであるため、これは奇妙です。

 ArrayList<SortInfo> sList = new ArrayList<SortInfo>();

なんで?また、SortInfo リストをメソッドに渡す方法は?

http://docs.oracle.com/javase/6/docs/api/javax/management/MBeanServerConnection.html

4

2 に答える 2

3

ジェネリックは実行時に型が消去されるため、操作パラメーターをオブジェクトのリストと見なしてください。これは、同じ名前と同じ数のパラメーターを持つ複数の操作がある場合、何かを変更する必要があることを意味します。(つまり、List のジェネリック型だけを区別することはできません)。したがって、リストはコンパイル時に型指定できますが、実行時には、SortInfos のリストとして定義したものは実際にはオブジェクトのリストであり、SortInfos ではないオブジェクトを含むリストを渡すと、まあ.... GIGO

また、パラメーターとして単純に a を使用することをお勧めList<[Type]>します。また、pr123が指摘したように、引数として渡すリスト内の値はシリアライズ可能である必要がありますが、それはターゲット MBeanServer に到達するために呼び出しがシリアライズされる場合のみです。(以下の例では、そうではありません)。

次に例を示します。

インターフェース

public interface GenericOpServiceMBean {
    public String op(List<Date> dates);
}

実装

public class GenericOpService implements GenericOpServiceMBean {
    public String op(List<Date> dates) {
        if(dates==null || dates.isEmpty()) return "";
        StringBuilder b = new StringBuilder();
        for(Date d: dates) {
            b.append("\n\t").append(d);
        }
        return b.toString();
    }
}

テスト

public class GenericArgsMBeanTest {

    public static final MBeanServer SERVER = ManagementFactory.getPlatformMBeanServer();

    public static void main(String[] args) {
        log("GenericArgsMBeanTest");
        try {
            ObjectName on = new ObjectName("test:svc=Generic");
            SERVER.registerMBean(new GenericOpService(), on);
            // invoking public String op(List<Date> dates);
            List<Date> dates = new ArrayList<Date>(Arrays.asList(new Date[]{
                    new Date(System.currentTimeMillis()),
                    new Date(System.currentTimeMillis()-1000),
                    new Date(System.currentTimeMillis()-10000)
            }));
            String result = (String)SERVER.invoke(on, "op", new Object[]{dates}, new String[]{List.class.getName()});
            // Note: We need to use the List class name, not ArrayList.
            log("Result:\n" + result);
        } catch (Exception ex) {
            ex.printStackTrace(System.err);
        }
    }


    public static void log(Object msg) {
        System.out.println(msg);
    }
}

出力

GenericArgsMBeanTest
Result:

    Tue Jun 25 10:44:15 EDT 2013
    Tue Jun 25 10:44:14 EDT 2013
    Tue Jun 25 10:44:05 EDT 2013
于 2013-06-25T14:49:47.387 に答える
0

SortInfo クラスは Serializable を実装する必要があります

于 2013-06-25T11:13:32.417 に答える