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

时间:2013-05-04 17:39:02

标签: 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 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);

执行代码需要告诉arrayManager()它想要存储哪些食物。 arrayManager()方法显示简单的通用图像并存储令牌供以后参考。但我找不到获取特定子类的通用图像的方法。

如果arrayManager()方法想要实例化传入的令牌,那么没问题,我可以:

foodToken.newInstance();

然后我可以调用GetImage()的非静态版本。

但是当我只想要一个静态方法给我一个与特定Apple实例无关的通用图像时,必须实例化一个Food类型对象(在arrayManager()调用之前或之后)似乎很荒谬。如果我存储令牌并临时实例化以检索图像,我必须实例化,然后每当我需要来自该子类的静态方法的东西时抛弃该对象。如果我实例化并存储实际对象而不是令牌,我面临着存储数千个相同的对象只是为了获得通用信息。

我几周来一直在努力解决这个问题的版本。到目前为止,我还没有找到任何似乎包含必须传递给方法的令牌问题。如果我的方法论都是湿的,我会对其他事情采取其他方式。我希望我不必使用笨重的反射代码。 谢谢你的阅读。

2 个答案:

答案 0 :(得分:0)

你可以用反射来做到这一点:(假设你在同一个包中)

Method m = foodToken.getMethod("getImage");
Image image = (Image) m.invoke(null);

如果您不在包中,则可能无法访问这些方法(至少在您的示例中定义),但您也可以使用反射来修复它。在这种情况下,请使用getDeclaredMethod代替getMethod,并致电setAccessible(true)以使其可供调用者访问。

答案 1 :(得分:0)

您可以使用Reflection轻松完成此操作。如果你想要一个简单的方法来做到这一点,我有一个开源轻量级库,没有第三方依赖,并在Maven Central上。

Checkout Reflect哪个有完整的食谱示例:https://github.com/gondor/reflect

使用Reflect:

执行此操作
Image image = Reflect.on(Reflect.on(foodToken.getClass()).mutators().get("image"))
                     .against(foodToken).call(); 

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