java - 不使用构造函数获取子类的 java.lang.Class 实例

标签 java class reflection subclass superclass

情况如下: 我得到了一个带有字段和方法的抽象类,并可以访问它们(AModule)。 我有另一个类扩展了这个抽象类(例如 TestModule),但我不知道/无法在父类(super class)中获取此子类的 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
    }
}

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

提前致谢:)

最佳答案

其实很简单:

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

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

两个方法foo()bar()中...结果 getClass()this 的类。

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

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

关于java - 不使用构造函数获取子类的 java.lang.Class 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48644646/

相关文章:

java - 如何在java的 list 文件中设置主类和类路径

Java 集合过滤

java - 您如何断言在 JUnit 测试中引发了某个异常?

c++ - 如何重载数组索引运算符的多个下标?

class - Dart:基于 JSON 响应创建动态类

java - 归并排序中的递归如何工作?内存将如何分配?

android - Activity 和 PreferenceActivity 的公共(public)代码

c# - 如何从 C# 中的对象实例获取自定义属性

具有类类型的 Java 反射 getDeclaredMethod()

c# - 从 StackFrame 获取类型 T