将对象转换为反射类和方法

时间:2012-07-02 07:31:39

标签: java java-ee reflection

我正在尝试的正常形式就是这个。

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

3 个答案:

答案 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); }
}