我正在尝试的正常形式就是这个。
MyClassFacadeLocal cls = new MyClassFacadeLocal();
List allMyClass = cls.findAll();
Iterator it = allMyClass.iterator();
while(it.haxNext()) {
MyClass Obj = (MyClass)it.next();
out.println(obj.getTitle());
}
现在,问题是我正在创建一个全局方法,它可以处理几个这样的情况。为此,我将传递实体类名称,方法名称和.findAll()
方法返回的List。如何使用反射来解决这个问题。我尝试的东西非常粗糙,当然没有用。
List allMyClass; //I will have passed this before
Iterator it = allMyClass.iterator();
while(it.hasNext()) {
try {
Class<?> c = Class.forName(this.getEntityClassName());
c.cast(it.next());
Method method = c.getDeclaredMethod("getTitle");
String title = method.invoke(c, null).toString();
} catch(Exception e) {
}
}
给出:"object is not an instance of declaring class"
错误。但我确信这是一个使用缺陷。
答案 0 :(得分:0)
我看到的第一眼瑕疵就是你没有指定
c.cast(it.next());
到新变量。
答案 1 :(得分:0)
真的,你不应该用反射来做到这一点。使所有实体使用getTitle()
方法实现公共接口:
public interface HasTitle {
public String getTitle();
}
public class MyClass1 implements HasTitle {
// ...
@Override
public String getTitle() {
return this.title;
}
}
public class MyClass2 implements HasTitle {
// ...
@Override
public String getTitle() {
return this.title;
}
}
...
/**
* This method can be invoked withg a List<MyClass1> or with a List<MyClass2>
* as argument, since MyClass1 and MyClass2 both implement HasTitle
*/
public void displayTitles(List<? extends HasTitle> entities) {
for (HasTitle entity : entities) {
out.println(entity.getTitle();
}
}
答案 2 :(得分:0)
使用Class.forName
并使用错误的反射方法getDeclaredMethod
,您的代码做了太多工作 - 没有考虑继承的方法。 c.cast
行没有做任何事情 - 它只是声明对象是它自己的类的实例。
使用此代码:
public static void printProp(List<?> xs, String methodName) {
try {
for (Object x : xs)
System.out.println(x.getClass().getMethod(methodName).invoke(x));
} catch (Exception e) { throw new RuntimeException(e); }
}