【问题标题】:Java class instance from type Object can only call methods of type Object来自 Object 类型的 Java 类实例只能调用 Object 类型的方法
【发布时间】:2014-07-02 07:45:47
【问题描述】:

我实现了本教程 http://www.javablogging.com/dynamic-in-memory-compilation/comment-page-1/#comment-65105 中的代码,它在一个坚果壳中动态创建一个类并仅将其保存到内存中(而不是写入扩展名为 .java 的文件并编译该文件带有扩展名.class)。在他的main 末尾,他用

实例化了这个类
    Object instance = fileManager.getClassLoader(null)
    .loadClass(fullName).newInstance();
    System.out.println(instance);

在我们创建的文件中,我们定义了toString 方法,所以当我们打印出instance 时,会打印出类名。但是当我向类中添加方法并尝试调用它们时,我收到错误 method is undefined for type object

我知道在正常情况下,我需要像 Object obj = new Foo(); 一样使用 Object,然后我可以调用 Foo 的成员,但是使用上面显示的代码,我无法将 new 粘贴在 fileManager...newInstance(); 前面

结论:

如何根据教程创建 DynaClass(动态创建的类)的实例并调用其成员。

更新:

我不确定是否可以转换对象,因为我们正在动态创建类并且所有内容都在字符串中。据我所知,您不能使用字符串名称进行转换。

【问题讨论】:

  • 简单 - 投射它(如果可以的话)。
  • @duffymo 如果类型还不存在,你会将它转换成什么? (还是我误解了这里的目的?)
  • 该类型存在于内存中,但我们没有将其转换为的名称,因为该名称在字符串中。
  • 你试过Foo foo = (Foo)instance;吗?如果您在运行时从源代码创建类,请尝试 Javassist 或 Janino 库。
  • 没有Foo 可以投射。我可以查看这些库,但我需要避免使用库并使用纯 Java。

标签: java object dynamic


【解决方案1】:

施放它?

Foo 实例= (Foo) fileManager.getClassLoader(null) .loadClass(fullName).newInstance();

编辑

哦,显然您将类代码创建为字符串,因此在编译时没有可链接的内容...

所以我猜除了通过反射调用方法之外你无能为力吗?

  Method method = instance.getClass().getMethod("myMethod", noparams);
    method.invoke(instance, null);

最好使用您想要使用的方法创建一个接口,并且您的动态类实现该接口。然后您可以将您的对象投射到该接口。这通常是插件的工作方式。

【讨论】:

  • 如果您浏览本教程,您会看到我们正在使用字符串动态创建此类,因此我无法将字符串对象放入强制转换中。
  • 反思是唯一的方法吗?这似乎很麻烦。我不应该能够拥有对象的实例并正常使用它吗?
  • 这很繁琐,但那是因为 Java 并不是真的打算这样做。
  • 实现一个接口怎么样? (见我更新的答案)
  • 无论如何,即使您使用反射提供的代码仍然不允许在instance 上使用getDeclaredMethod,因为它认为它是Object
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-30
  • 2020-02-26
  • 1970-01-01
  • 2021-09-11
  • 2021-07-16
  • 2020-02-03
  • 1970-01-01
相关资源
最近更新 更多