我是Java的新手(大约10天),所以我的代码可能非常糟糕,但这就是我所拥有的:
ArgsDataHolder argsData = new ArgsDataHolder(); // a class that holds two
// ArrayList's where each element
// representing key/value args
Class thisArgClass;
String thisArgString;
Object thisArg;
for(int i=2; i< argsString.length; i++) {
thisToken = argsString[i];
thisArgClassString = getClassStringFromToken(thisToken).toLowerCase();
System.out.println("thisArgClassString: " + thisArgClassString);
thisArgClass = getClassFromClassString(thisArgClassString);
// find closing tag; concatenate middle
Integer j = new Integer(i+1);
thisArgString = getArgValue(argsString, j, "</" + thisArgClassString + ">");
thisArg = thisArgClass.newInstance();
thisArg = thisArgClass.valueOf(thisArgString);
argsData.append(thisArg, thisArgClass);
}
用户基本上必须以这种格式在命令提示符中输入一组键/值参数:<class>value</class>
,例如<int>62</int>
。使用此示例,thisArgClass
将等于Integer.class
,thisArgString
将是一个读取“62”的字符串,而thisArg
将是一个等于62。
我尝试thisArg.valueOf(thisArgString)
,但我猜valueOf(<String>)
只是Object的某些子类的方法。无论出于何种原因,我似乎无法将thisArg强制转换为thisArgClass(如此:thisArg = (thisArgClass)thisArgClass.newInstance();
,此时valueOf(<String>)
应该可以访问。
必须有一个漂亮,干净的方式来做到这一点,但在这一点上超出了我的能力。如何获取加载到动态类型对象(Integer,Long,Float,Double,String,Character,Boolean等)中的字符串的值?或者我只是想过这个,Java会为我做转换吗? :困惑:
答案 0 :(得分:1)
我似乎无法将thisArg强制转换为thisArgClass(如此:thisArg =(thisArgClass)thisArgClass.newInstance();,
这不会像这样工作,因为您需要首先初始化thisArgClass
。这将产生编译时错误。更改代码如下:
Class thisArgClass = null;
try {
Object thisArg = thisArgClass.newInstance();
} catch (InstantiationException ex) {
Logger.getLogger(Test3.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Test3.class.getName()).log(Level.SEVERE, null, ex);
}
希望这会对你有所帮助。
答案 1 :(得分:1)
这里有几个问题。我假设thisArgClass
已正确设置;对于您的示例,它将包含Integer.class
。为了在newInstance()
对象上调用Class
,类必须具有无参数构造函数。类Integer
没有这样的构造函数,因此您必须使用更多的roundabout方法调用其中一个现有构造函数:
Constructor<Object> c = thisArgClass.getConstructor(String.class);
Object i = c.newInstance(thisArgString);
由于在运行之前您不知道对象的实际类型,因此必须使用<Object>
并在使用该值之前将结果转换为所需类型。