我正在尝试创建一个commonMethod,它接受Generic List allData类型并打印出收到的alldata对象的值。另外,我发送className作为参数,以便我们可以通过反射检索Class和Fields。
除了要在forloop中声明className的部分之外,我几乎就在那里。我知道代码的其余部分是有效的,因为我尝试对ClassName进行硬编码并且它可以工作。
public void commonMethod(List<?> alldata, String className) {
Class c = Class.forName(className);
Field[] fields = c.getDeclaredFields();
//I would like to define incoming className here..but failing
for (className c : alldata) {
for (Field field : fields) {
field.setAccessible(true);
Object value = null;
value = field.get(c);
System.out.println(value);
//use the value in some other code
}
}
}
如何更改此部分 for(className c:alldata)让它工作..
由于
答案 0 :(得分:2)
您不能按照您想要的方式执行此操作,因为将变量声明为某种类型(typeName variableName
)是为您在编译时知道的类型名称保留的。
正确的方法是使用:
for (Object c : alldata) {
field.get(c)
可以正常使用,因为the get
method takes an Object
,所以c
将具有足够好的类型。
答案 1 :(得分:1)
将参数列表的泛型类型更改为具体而不是List<T> alldata
,例如{{1}}。
答案 2 :(得分:1)
我建议你修改下面的代码以适应泛型
public <T>void commonMethod(List<T> alldata) {
for (T c : alldata) {
....
.....
}
}
现在无论你提供什么类,编译器都会很容易理解将变量c
转换成所需的类。
更好的是RC在评论中建议的内容:
public <T> void commonMethod(List<T> alldata, Class<T> c) {
Field[] fields = c.getDeclaredFields();
for (T c : alldata) {
for (Field field : fields) {
field.setAccessible(true);
Object value = null;
value = field.get(c);
System.out.println(value);
//use the value in some other code
}
}
}
答案 3 :(得分:1)
这个怎么样:
public <T> void commonMethod(List<T> alldata) {
// do something
}
答案 4 :(得分:-1)
你应该从每个元素而不是参数获得Class
。
static void commonMethod(List<Object> alldata) throws IllegalArgumentException, IllegalAccessException {
for (Object obj : alldata) {
Class<?> clazz = obj.getClass();
for (Field f : clazz.getFields()) {
f.setAccessible(true);
System.out.print(" " + f.getName() + "=" + f.get(obj));
}
System.out.println();
}
}