Java 如何从类令牌访问子类静态方法?

Java 如何从类令牌访问子类静态方法?,java,class,methods,static,Java,Class,Methods,Static,我遇到的问题是,如何将令牌(如Apple.class)传递到方法中,然后访问子类的静态方法,以便检索有关子类的一般信息?(在本例中为苹果的一般图像) 以下是一些类似Java的psudocode: abstract class Food { } class Apple extends Food { static Image getImage(){ return (generic image of an apple); } } class Onion extend

我遇到的问题是,如何将令牌(如
Apple.class
)传递到方法中,然后访问子类的静态方法,以便检索有关子类的一般信息?(在本例中为苹果的一般图像)

以下是一些类似Java的psudocode:

abstract class Food {
}         

class Apple extends Food {
  static Image getImage(){
    return (generic image of an apple);
  }
}
class Onion extends Food {
  static Image getImage(){
    return (generic image of an onion);
  }
}

void arrayManager(Class<? extends Food> foodToken){
  useImage(foodToken.getImage()); // <-- can't access static methods from Class token
  storeType(foodToken);
}

//... executing code ...
arrayManager(Apple.class);
arrayManager(Onion.class);
然后我可以调用非静态版本的
GetImage()

但是,当我只需要一个静态方法为我提供一个与特定苹果实例无关的通用映像时,必须实例化一个食物类型对象(在调用
arrayManager()
之前或之后)似乎很荒谬。如果我存储令牌并临时实例化以检索图像,那么每当我需要该子类的静态方法中的某些内容时,我都必须实例化然后扔掉该对象。如果我实例化并存储实际对象而不是令牌,我将面临存储数千个相同的对象以获取一般信息的问题

几个星期以来,我一直在为这个问题的版本而挣扎。到目前为止,我还没有发现任何似乎包含令牌必须传递到方法的问题。如果我的方法论完全是湿的,我会接受其他的方法。我希望我不必使用大量的反射代码。
感谢您的阅读。

您可以通过反射来实现这一点:(假设您在同一个包中)


如果您在包之外,那么这些方法可能无法访问(至少在您的示例中定义),但是您也可以使用反射来解决这个问题。在这种情况下,请使用
getDeclaredMethod
而不是
getMethod
,并调用
setAccessible(true)
使调用者可以访问该方法。

您可以通过反射轻松完成此操作。如果您想要一种简单的方法来实现这一点,我有一个开源的轻量级库,它没有第三方依赖项,并且位于Maven Central上

结帐反映了完整的配方示例:

使用Reflect执行此操作:

Image image = Reflect.on(Reflect.on(foodToken.getClass()).mutators().get("image"))
                     .against(foodToken).call(); 

如果您不想使用任何库,那么@Mark Elliots answer是正确的

您可以为此使用反射,但将其更改为
arrayManager不是更简单吗(ClassGreat suggestion,我没有想到这个主意。虽然它确实降低了拥有令牌的效用。这是一个很好的答案,我不知道这可以做到。谢谢。我看到的唯一缺点是,如果
getImage()
方法被重命名,它会断开链接。
Method m = foodToken.getMethod("getImage");
Image image = (Image) m.invoke(null);
Image image = Reflect.on(Reflect.on(foodToken.getClass()).mutators().get("image"))
                     .against(foodToken).call();