-2

我正在尝试的一种正常形式是这样的。

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 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"错误。但我相信这是一个使用缺陷。

4

3 回答 3

0

我看到的第一眼缺陷是您没有分配

c.cast(it.next());

到新变量。

于 2012-07-02T07:43:33.227 回答
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();
    }
}
于 2012-07-02T07:53:03.920 回答
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); }
}
于 2012-07-02T07:59:05.187 回答