通过java jmx功能调用方法,其中参数是ArrayList
我知道可以使用jmx调用java类中的方法,如下所示:通过java jmx功能调用方法,其中参数是ArrayList,java,connection,parameter-passing,jmx,Java,Connection,Parameter Passing,Jmx,我知道可以使用jmx调用java类中的方法,如下所示: try { JMXServiceURL serviceUrl = new JMXServiceURL(URL); jmxConnector = JMXConnectorFactory.connect(serviceUrl, null); ObjectName objectName = new ObjectName("whatever"); MBeanServerCon
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);
}
如果我们想调用带有参数的方法,我们需要将实际参数作为对象数组传递,并将参数类型作为字符串数组传递。
让我们继续上面的例子,假设我想传递一个名为sList的字符串ArrayList:
ArrayList<String> sList = new ArrayList<String>();
sList.add("kapd_be");
Object paramsForInvoke[] = {sList};
String signitureForInvoke[] = {ArrayList.class.getName()};
ArrayList sList=new ArrayList();
添加(“kapd_be”);
对象参数paramsForInvoke[]={sList};
字符串SignatureForInvoke[]={ArrayList.class.getName()};
在这种情况下,一切正常,使用适当的参数调用该方法。
我能够在调用的方法中提取“kapd_be”字符串
但是,如果我希望参数是其他类的ArrayList,比如说SortInfo(这是我编写的一个POJO类,包含多个字段),那么代码不会执行,我甚至无法调用该方法,因此显然无法提取任何参数。
这很奇怪,因为唯一的区别是:
ArrayList<SortInfo> sList = new ArrayList<SortInfo>();
ArrayList sList=new ArrayList();
为什么??以及如何将SortInfo列表传递给该方法
StutnFipe类必须实现可序列化的
泛型将在运行时被擦除,因此将操作参数视为对象列表。这意味着,如果有多个操作具有相同的名称和相同数量的参数,则需要修改某些内容。(即列表的泛型类型不能是唯一的区别)。因此,可以在编译时键入列表,但在运行时,您定义为SortInfos列表的实际上是一个对象列表,如果您传入一个包含非SortInfos对象的列表,那么。。。。G.I.G.O 我还建议您只需使用列表
作为参数。如pr123所述,列表中作为参数传递的值确实需要序列化,但只有在调用将被序列化以到达目标MBeanServer时才需要序列化。(在下面的示例中,它不会)
下面是一个例子:
接口
public interface GenericOpServiceMBean {
public String op(List<Date> dates);
}
实际上,实现seriazable接口解决了我的问题,但我接受了你的详细解释,我没有注意到你回答了自己的问题……:)
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