【问题标题】:Can we cast a object into a class type whose name is only known?我们可以将一个对象转换为一个名称只知道的类类型吗?
【发布时间】:2015-08-07 20:43:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你为什么不试试看会发生什么? :)
  • 如果您在编译时不知道所需的类型,那么这样的强制转换会实现什么?
  • 我收到一个编译时错误,指出 obj 无法解析为变量。
  • obj1.getName(); 会报编译错误。
  • @user1283438 这是有道理的,因为Object 类型没有getName() 方法,而你告诉编译器的只是“obj1 是某种Object "。

标签: java jsp reflection


【解决方案1】:

forName 接受一个字符串,你不能在 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);

我不建议在任何生产应用程序中使用此代码。您需要进行大量验证和异常处理才能安全地进行这项工作。

【讨论】:

  • 如果对象“clazz”不是新创建的,而是使用来自会话的对象,即有一个对象类类型的“obj”和一个代表的字符串一起传递,这将解决我的问题必须对其进行类型转换的类名。是否可以将“obj”类型转换为名为 class 的字符串(如果考虑上面的示例,则为 Book)并调用需要字符串参数的特定方法,@Dennis Hunziker
  • 我不明白你的意思,在我发布的代码中,名为 obj 的对象是 Book 类型的实例:Object obj = new Book("test");,所以这就是你的会话中的字符串表示类型。如果您已经有一个代表 Book 的 Class 对象的实例,那么您只需省略第一行。
  • 感谢@Dennis Hunziker,您提出的解决方案帮助了我。
  • 谢谢,如果您愿意 accept the answer,我将不胜感激,如果它解决了您的问题,请点击复选标记,我相信其他人也会这样做。
  • 对象 obj1 = clazz.cast(b);此语句在运行时在某些方法(其中 b 是 Object 类型的输入参数)中导致“ClassCastException”,因为它在用作 Object obj1 = clazz.cast(b.get(i)); 时是成功的;其中 List b 是另一个方法的输入参数。在这两种方法中 Class> clazz = Class.forName("np.com.mshrestha.bookstore.model.Book");很常见
【解决方案2】:

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

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

【讨论】:

  • 如果 obj 属于 java 中所有类的超类“Object”类,那么在这种情况下向下转换为 Book 类是不可能的?
猜你喜欢
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-25
  • 2013-09-18
  • 2011-12-25
  • 1970-01-01
相关资源
最近更新 更多