【问题标题】:Getting a subclass' java.lang.Class instance without using a constructor在不使用构造函数的情况下获取子类的 java.lang.Class 实例
【发布时间】:2018-02-06 13:49:54
【问题描述】:

情况如下所述: 我有一个包含字段和方法的抽象类,并且可以访问所有这些(AModule)。 我得到了另一个扩展这个抽象类的类(例如 TestModule),但我不知道/不能在不使用构造函数准确传递这个实例的情况下在超类中获取这个子类的 java.lang.Class 实例。 子类类型并不总是相同,这只是当前结果的一个示例:

public abstract class AModule
{

   private Class<? extends AModule> clazz;

   public AModule(Class<? extends AModule> clazz)
   {
       this.clazz = clazz;
       //this.getClass() will return AModule.class
   }

   public Method resolve()
   {
       return this.clazz.getDeclaredMethods()[0];
       //I want get the fields and methods; e.g. foo() of TestModule
   }

}

public class TestModule extends AModule
{

    public TestModule()
    {
        super( TestModule.class );
    }

    public void foo()
    {
       //code
    }

}

public class ModuleLoader
{
    public static void resolveModule(AModule module)
    {
        //at this point I don't know the class TestModule
        //but I want to invoke foo()
        module.resolve().invoke(module); 
        //module.getClass() will return AModule.class
    }
}

我需要这个子类实例来获取所有字段和方法,以通过反射来分析和调用它们,正如注释所定义的那样。 有没有人想办法解决这个问题以取回默认构造函数,而无需对子类实例进行超级调用?

提前致谢:)

【问题讨论】:

  • 只需调用getClass()。
  • 如果我在 AModule.class 中调用 getClass(),它不会返回 TestModule.class,它会返回 AModule.class...
  • 不,我不这么认为。
  • 似乎同时有两个问题。首先,这个问题基于关于getClass() 所做的错误假设。 getClass() 始终返回实例的实际类,无论您在何处进行调用。所以不需要将Class 对象从实际的子类传递给超类。第二个问题似乎是关于在你只知道抽象模块类的情况下如何获取实现类。答案是,没有简单的方法可以做到这一点,因为类不知道它们现有的子类型。
  • 但请查看ServiceLoader,了解声明和查找抽象模块(“服务”)类的现有实现的标准方法。

标签: java class reflection subclass superclass


【解决方案1】:

其实很简单:

class Base {
  void foo() {
    ... x = getClass();

和

class Child extends Base {
  void bar() {
    ... x = getClass();

在both 方法foo() 和bar() ...getClass() 的result 是this 的类。

换句话说:当您在 Base 对象上调用 foo/bar 时,getClass() 会返回 Base。如果在 Child 对象上调用,在这两种方法中,结果都是 Child。

含义:只需使用getClass(),而不是在构造函数中硬编码类名!

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2017-01-05
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多