获得一个子类'不使用构造函数的java.lang.Class实例

时间:2018-02-06 13:49:54

标签: java class reflection subclass superclass

情况如下所述: 我得到了一个带有字段和方法的抽象类,并且可以访问所有这些类(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
    }
}

我需要这个子类实例来获取所有字段和方法来分析并通过注释调用它们来调用它们。 有没有人有想法解决这个问题以获得默认构造函数,而没有与子类实例的超级调用?

提前致谢:)

1 个答案:

答案 0 :(得分:1)

实际上很简单:

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

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

两个方法foo()bar() ... getClass()结果这个类即可。

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

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