【问题标题】:How to use methods of a wildcard class<?> result如何使用通配符类<?>结果的方法
【发布时间】:2021-05-28 14:25:17
【问题描述】:

我正在尝试构建一个通用工具来查找休眠类并通过元数据使用其方法。

所以我从数据库中得到 1: "TABLENAME" 2. "methodname"

第 1 步。找到休眠已完成。

Class<?> result = generator.getClassFromTableName("TABLENAME");

第 2 步。使用返回的类中的方法是我没有得到的。

我需要使用类加载器还是通过result.getConstructors找到它?

如果我最终得到一个“TableName”实例并且能够访问它的所有方法,那么最简单的方法就是。希望清楚!

【问题讨论】:

  • 我建议你阅读reflection
  • 我确实看到了该指南,但我被困在 Bird bird = (Bird),对我来说这是不可能的。我只有类名和方法。结果(参数).方法名()。
  • Bird bird = (Bird) 在第 8 节中。泛型调用带有参数的对象构造函数及其方法是我卡住的地方
  • 如果您无法访问(或无法预先了解要加载的实现的类的类型),则可以回退到 Object 作为类型,并且可以通过反射调用方法API。如果您确实知道该类实现了哪个接口,则可以使用接口名称代替Object 或类类型。

标签: java generics wildcard


【解决方案1】:

感谢 @rsp 让我们放心地查看 Reflection。第一次深入研究它,最后它非常简单。

  • 类加载器从字符串参数加载类

  • getConstructor 到 找到正确的构造函数并将其与 newInstance() 一起使用

  • getDeclaredMethod 找到正确的方法并将其与 Invoke 和 对象实例

     Class< ? > testdataClass = getClass().getClassLoader().loadClass(testDataClassname);
     Constructor<?> tesdataClassConstructor = Objects.requireNonNull(testdataClass).getConstructor(datacontext);
     Object testdataClassObject = tesdataClassConstructor.newInstance(dc);
     Method buildMethod = testdataClass.getDeclaredMethod("build");
     return buildMethod.invoke(testdataClassObject);
    

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-14
    相关资源
    最近更新 更多