情况如下:我得到了一个包含字段和方法的抽象类,并且可以访问所有这些字段和方法(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
}
}
我需要这个子类实例来获取所有字段和方法,以通过注释定义的反射来分析和调用它们。有没有人有办法解决这个问题,在没有这个子类实例的超级调用的情况下,找回默认的构造函数?
提前感谢:)
发布于 2018-02-06 21:55:34
它实际上相当简单:
class Base {
void foo() {
... x = getClass();
和
class Child extends Base {
void bar() {
... x = getClass();
在中,方法foo()
和bar()
...getClass()
的结果是this的类。
换句话说:当您在基本对象上调用foo/bar时,getClass()将返回基本。如果在子对象上调用,在这两种方法中,结果都是子。
含义:只需使用getClass()
而不是在该构造函数中硬编码类名!
https://stackoverflow.com/questions/48644646
复制相似问题