Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Java)有没有一种对象可以处理从原语到数组的任何东西?_Java_Polymorphism - Fatal编程技术网

(Java)有没有一种对象可以处理从原语到数组的任何东西?

(Java)有没有一种对象可以处理从原语到数组的任何东西?,java,polymorphism,Java,Polymorphism,我对Java非常陌生,所以我希望你们中的一位知道如何做到这一点。我让用户以任何类似XML的方式指定要传递给我的应用程序外部的方法的参数的类型和值 示例:javac myAppsName externalJavaClass methodofExternalClass[参数] 当然,为了找到合适的方法,我们必须有合适的参数类型,因为方法可能会被重载,这是区分不同版本之间差异的唯一方法。参数当前的格式如下: (type)value(/type),例如(int)71(/int)(string)这是我作为

我对Java非常陌生,所以我希望你们中的一位知道如何做到这一点。我让用户以任何类似XML的方式指定要传递给我的应用程序外部的方法的参数的类型和值

示例:javac myAppsName externalJavaClass methodofExternalClass[参数]

当然,为了找到合适的方法,我们必须有合适的参数类型,因为方法可能会被重载,这是区分不同版本之间差异的唯一方法。参数当前的格式如下:

(type)value(/type),例如(int)71(/int)(string)这是我作为参数传递的字符串!(/string)

我解析它们,获取所指示的任何类型的构造函数,然后通过运行其方法
newInstance()
,将新实例加载到
对象中,来执行该构造函数。这很好用,但我们都知道,有些方法采用数组,甚至是多维数组

我可以像这样处理参数格式:
(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[][]数组。这个实现不会很漂亮。)

是的,它被称为
java.lang.Object
。甚至可以将
int[][]
之类的数组分配给声明为
java.lang.Object
的变量


但我担心这不是你想要的。似乎您正在编写一个客户机服务框架——客户机(您的用户)将一些数据传递给服务(您的应用程序)。现有的库也可以做同样的事情,例如Thrift、Protobuf。如果您正在寻找基于XML的解决方案,那么有SOAP。

您真正想要的是JSON,以及处理它的Java工具包之一。

我认为您在这里想要的是一种基于XML文件中描述的属性动态调用Java方法的方法

如果是这样,您可以探索Java反射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>

关于我正在做的事情,我正在制作我的第二个Java应用程序,第一个是“Hello,world!”,我尝试将一个int数组加载到一个对象中,它产生了一个错误:invoke.Java:28:error:
array required,但是找到了对象,dummy[0]=“Blimey!”来自代码:
对象虚拟;dummy=新字符串[10];虚拟[0]=“天哪!”
(抱歉…必须删除以前的版本。编辑它太晚了。哈哈。)@Michael如果这是你的第二个java应用程序,我的建议是慢下来!制作一些只来回传递相同的简单类型的东西,然后构建不同的类型从技术上讲,你可以将任何东西放入
对象
变量--
虚拟
,如果你愿意,但当你尝试使用它时,它是另一回事。在访问其单元格之前,需要将“
伪”
转换为实际的字符串数组:
((字符串[])伪)[0]=“Blimey!”dummy
可能包含不同类型的值(字符串、整数、双精度、数组等)时,事情就会变得一团糟。我认为这不是一个好方法。@dann.dev我正在阅读的Java书籍节奏相当快。除了String类的一些方法之外,我认为我没有在这个应用程序中使用过本书中没有介绍过的任何东西,而且我只完成了25%。谁知道下一章我会得到什么好处呢!:pI还认为JSON适合这种情况。有一个名为的JSON库。示例:
System.out.println(net.sf.json.JSONArray.fromObject(“[1,'string',['two-dimension','array',2.2]]”)正确,但您已经使用了已知参数类型的已知函数(String.class和String[].class,String.class)。这是我的代码:
methodthemethod=class.getMethod(args[1],argsClassArray);ret=method.invoke(null,argsObjectArray)我必须用从用户输入中提取的类来填充argsClassArray,这些类可以是任何东西--int,String,String[],int[]]。作为对新编辑的响应,是的,类似于这样,但问题是如何将解析文本“String[].class”更改为实际的类变量?我可以做
Class.forName(“String[]”)?我没有想到这一点。如果你说的是数组,那么你应该看看java反射数组apitstring[]arr=(String[])array.newInstance(String.class,length);无法获取
Class thisClass=Class.forName(“字符串[]”)
可以工作,但是数组构造函数的反射调用可以产生一个动态类型的数组,所以这应该很好。谢谢
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;