我们可以将对象转换为名称仅为已知的类类型吗?

时间:2015-08-07 10:30:02

标签: java jsp reflection

我必须动态地获取名称在jsp中的下拉列表中可用的表。在选择表名时,应打印相应的列。为此我在jsp中运行循环并尝试但是是否可以将“Object”类型的对象转换为类名仅为已知的类,然后使用该对象我必须使用相应的类方法。

ex:className我从jsp获得的是“Book”,我有一个类Book.class,它有一个方法getName()所以这就是我想要的东西:

 Object obj1 =  Class.forName(className).cast(obj);
 obj1.getName();

这里obj是我通过会话获得的对象。

2 个答案:

答案 0 :(得分:0)

是的,你可以这样做但是对象必须属于那个类或它的一些子类,否则它会给你一个ClassCastException。您还需要通过包传递该类的完整路径,即完全限定的类名。

Object obj1 =  Class.forName(com.Book).cast(obj);
obj1.getName();

答案 1 :(得分:0)

forName接受一个String,你不能在Object上调用getMethod,因为没有这样的方法。理想情况下,您可以使用一个界面来定义您可以从下拉列表中选择的所有类型中常见的方法。

如果这不是一个选项,那么使用反射有一个更丑陋的选项,你实际上不需要事先知道这个类型:

Class<?> clazz = Class.forName("Book");
// Object obj1 = clazz.cast(obj);
// The method getName() is undefined for the type Object

Method m = clazz.getMethod("getName");
String res = (String) m.invoke(obj);

我不建议在任何生产应用程序中使用此代码。您需要进行相当多的验证和异常处理才能使其安全运行。