我对Java很陌生,所以我希望你们其中一个人知道如何做到这一点。我让用户以任何类似XML的方式指定参数的类型和值,以便传递给我的应用程序外部的方法。
示例:javac myAppsName externalJavaClass methodofExternalClass [parameters]
当然,要找到合适的方法,我们必须有适当的参数类型,因为方法可能会过载,这是区分不同版本的唯一方法。参数目前以这种方式格式化:
(类型)值(/类型),例如(int)71(/ int)(string)这是我作为参数传递的字符串!(/ string)
我解析它们,获取指示的任何类型的构造函数,然后通过运行其方法newInstance(<String value>)
执行该构造函数,将新实例加载到Object
。这很好用,但是众所周知,有些方法需要数组,甚至是多维数组。
我可以像这样处理参数格式:(array)(array)(int)0(/int)(int)1(/int)(/array)(array)(int)2(/int)(int)3(/int)(/array)(/array)
......或者甚至更好...... {{(int)0(/int)(int)1(/int)}{(int)2(/int)(int)3(/int)}}
。
问题是,如何实施?我是否必须开始在Object []数组中包装所有内容,以便我可以像argObj [0]一样处理基元等,但是像往常一样加载数组? (不幸的是,如果我想支持二维数组,我必须使它成为一个Object [] []数组。这种实现不会非常漂亮。)
答案 0 :(得分:3)
是的,它被称为java.lang.Object
。您甚至可以将int[][]
之类的数组分配给声明为java.lang.Object
的变量。
但我担心这不是你想要的。您似乎正在编写客户端服务框架 - 客户端(您的用户)将一些数据传递给服务(您的应用程序)。现有的库可以做同样的事情,例如Thrift,Protobuf。如果您正在寻找基于XML的解决方案,那就有SOAP。
答案 1 :(得分:3)
您真正需要的是JSON,以及用于处理它的Java工具包之一。
答案 2 :(得分:1)
我认为你在这里寻找的是一种基于XML文件中描述的属性动态调用Java方法的方法。
如果是这种情况,您可以浏览Java Reflection API。
示例类:
package foo;
public class Bar {
public void doSomething(String x) {
System.out.println("This is a method doSomething that takes in a String parameter");
}
public void doSomething(String [] arr, String str) {
System.out.println("This is a method doSomething that takes in a String arr parameter and a String parameter");
}
}
要动态使用此类中的方法,请执行以下操作:
Class c = Class.forName("foo.Bar");
Object newInstance = c.newInstance();
Method method = c.getMethod("doSomething", String.class);
// This will locate the first method
method.invoke(newInstance, "Hello World");
Method method = c.getMethod("doSomething", String[].class, String.class);
// This will locate the second method
String [] arr = {"Hello", "World"};
method.invoke(newInstance, arr, "Hello World");
因此,您可以在XML文件中指定如下:
<method>
<name>doSomething</name>
<params>
<param>java.lang.String</param>
</params>
</method>
<method>
<name>doSomething</name>
<params>
<param>java.lang.String[]</param> // or any other annotation to indicate that its an arr
<param>java.lang.String</param>
</params>
</method>
然后,读取XML文件并使用它来动态查找Java方法。
动态创建数组:
Class c = Class.forName("java.lang.String");
int length = 5;
Object o = Array.newInstance(c, length); // o is a String arr of length 5
String [] arr = (String []) o;