gpt4 book ai didi

java - 通过参数为 ArrayList 的 java jmx 功能调用方法

转载 作者:行者123 更新时间:2023-12-04 04:52:03 25 4
gpt4 key购买 nike

我知道可以使用 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

最佳答案

泛型将在运行时类型删除,因此将您的操作参数视为对象列表。这意味着如果您有多个具有相同名称和相同数量参数的操作,您将需要修改某些内容。 (即 List 的通用类型不能是唯一的区别)。所以列表可以在编译时输入,但在运行时,您定义为 SortInfos 列表的内容实际上是一个对象列表,如果您传入一个包含非 SortInfos 对象的列表,那么...... G.I.G.O.

我还建议您简单地使用 List<[Type]>作为你的参数。而作为 pr123 注意,您作为参数传递的列表中的值确实需要可序列化,但前提是您的调用将被序列化以到达目标 MBeanServer。 (在下面的示例中,它不会)。

这是一个例子:

接口(interface)

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

关于java - 通过参数为 ArrayList 的 java jmx 功能调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com