Java .对方法进行测试输入的通用铸件
我需要帮助使用泛型将字符串转换为不同的变量类型。我想做的是帮助初学者学习,给他们一个方法实现不正确的类,或者只给他们一个框架(只有方法名,没有其他名称),然后让他们修复它,然后用相同的方法对照一个量规类测试这个类和每个方法。在rubric类测试中,每个方法的输入都作为注释给出,但我找不到一种方法将字符串中的输入转换为所需的类型。我可以通过使用Java .对方法进行测试输入的通用铸件,java,generics,methods,casting,Java,Generics,Methods,Casting,我需要帮助使用泛型将字符串转换为不同的变量类型。我想做的是帮助初学者学习,给他们一个方法实现不正确的类,或者只给他们一个框架(只有方法名,没有其他名称),然后让他们修复它,然后用相同的方法对照一个量规类测试这个类和每个方法。在rubric类测试中,每个方法的输入都作为注释给出,但我找不到一种方法将字符串中的输入转换为所需的类型。我可以通过使用Method.getGenericParameterTypes()并将泛型设置为等于该值来获得所需的类型,但当我尝试使用该方法强制转换时,它不起作用。。。
Method.getGenericParameterTypes()
并将泛型设置为等于该值来获得所需的类型,但当我尝试使用该方法强制转换时,它不起作用。。。
以下是我的代码:
name = className.substring(0,className.indexOf("Copy"))+"Rubric";
String param = ReadWrite.readData("src/"+name+".java").get(methLoc);
Type B = meth.getGenericReturnType();
Type E;
Type [] params = meth.getGenericParameterTypes();
String [] para = param.substring(param.indexOf("(")+1,param.indexOf(")")).split(",");
@SuppressWarnings("rawtypes")
Class myClass = null;
Object obj = null;
classNamer();
try {
myClass = Class.forName(name);
obj = myClass.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (params.length != para.length) {
Console.log("Rubric test parameters are wrong");
}
else if (obj==null){
Console.log("Error instantiating objects");
}
else {
Object [] parames = new Object [params.length];
for (int i =0; i<para.length; i++) {
E = params[i];
parames[i] = ((E)para[i]);
System.out.println(params[i] + " " + para[i] + " " + parames[i] + " " + parames[i].getClass() + " " + E);
}
try {
B rtrn = (B) meth.invoke(obj, parames);
B rtrn2 = (B) testMethods[testNum].invoke(obj, parames);
if (rtrn.equals(rtrn2)) {
count++;
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
name=className.substring(0,className.indexOf(“复制”)+“Rubric”;
字符串param=ReadWrite.readData(“src/”+name+“.java”).get(methLoc);
类型B=meth.getGenericReturnType();
E型;
Type[]params=meth.getGenericParameterTypes();
字符串[]para=param.substring(param.indexOf(“”+1,param.indexOf(“”))。拆分(“”,“”);
@抑制警告(“原始类型”)
类myClass=null;
objectobj=null;
classNamer();
试一试{
myClass=Class.forName(名称);
obj=myClass.newInstance();
}catch(ClassNotFoundException |实例化Exception | IllegalacessException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
if(参数长度!=参数长度){
日志(“量规测试参数错误”);
}
else if(obj==null){
log(“实例化对象时出错”);
}
否则{
对象[]参数=新对象[params.length];
对于(int i=0;i您试图对类型E
执行的操作是不可能的,您不能在方法中生成泛型类型变量并对其进行强制转换。更重要的是,强制转换不会将一个对象转换为另一个不同类型的对象,它只是告诉编译器假定该对象已经是您强制转换到的类型。在运行时,如果对象不是那种类型,您将抛出一个ClassCastException
您需要做的是将字符串解析为各种类型的对象,以便对象的运行时类型与方法参数匹配。编译时类型只能是object
,因为method.invoke
无论如何都会将它们作为object[]
public static Object parseParam(String str, Type type) {
if (type.equals(String.class)) {
return str.replaceAll("^\"(.+)\"$", "$1"); // assumes strings are quoted
} else if (type.equals(int.class) || type.equals(Integer.class)) {
return Integer.parseInt(str);
// } else if (type.equals(...)) {
// return ... // implement more as needed
} else {
throw new RuntimeException("Class not supported: " + type);
}
}
请参见此处了解更多信息:(注意,接受的答案对于没有字符串的类不起作用)您可能想考虑将值存储为测试类中的字段,或者将其序列化,或者使用某种测试框架。一旦实现了,这样的事情就应该起作用:
name = className.substring(0, className.indexOf("Copy")) + "Rubric";
String input = ReadWrite.readData("src/" + name + ".java").get(methLoc);
Type[] params = meth.getGenericParameterTypes();
String[] para = input.substring(input.indexOf("(") + 1, input.indexOf(")")).split(",");
Class<?> myClass = null;
Object obj = null;
classNamer();
try {
myClass = Class.forName(name);
obj = myClass.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (params.length != para.length) {
Console.log("Rubric test parameters are wrong");
} else if (obj == null) {
Console.log("Error instantiating objects");
} else {
Object[] parames = new Object[params.length];
for (int i = 0; i < para.length; i++) {
parames[i] = parseParam(para[i], params[i]); // convert string to object
System.out.println(params[i] + " " + para[i] + " " + parames[i] + " " + parames[i].getClass());
}
try {
Object rtrn = meth.invoke(obj, parames);
Object rtrn2 = testMethods[testNum].invoke(obj, parames);
if (rtrn.equals(rtrn2)) {
count++;
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
name=className.substring(0,className.indexOf(“复制”)+“Rubric”;
字符串输入=ReadWrite.readData(“src/”+name+“.java”).get(methLoc);
Type[]params=meth.getGenericParameterTypes();
String[]para=input.substring(input.indexOf(“”+1,input.indexOf(“”)).split(“”,“”);
类myClass=null;
objectobj=null;
classNamer();
试一试{
myClass=Class.forName(名称);
obj=myClass.newInstance();
}catch(ClassNotFoundException |实例化Exception | IllegalacessException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
if(参数长度!=参数长度){
日志(“量规测试参数错误”);
}else if(obj==null){
log(“实例化对象时出错”);
}否则{
对象[]参数=新对象[params.length];
对于(int i=0;i
如果我理解正确,您正在尝试将字符串转换为任意类型的对象?输入字符串及其预期类型的一些示例是什么?是的,我正在尝试这样做,示例是将“(1,1)”转换为两个整数或值为1的整数。