我遇到的问题是如何将令牌(例如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()
调用之前或之后)似乎很荒谬。如果我存储令牌并临时实例化以检索图像,我必须实例化,然后每当我需要来自该子类的静态方法的东西时抛弃该对象。如果我实例化并存储实际对象而不是令牌,我面临着存储数千个相同的对象只是为了获得通用信息。
我几周来一直在努力解决这个问题的版本。到目前为止,我还没有找到任何似乎包含必须传递给方法的令牌问题。如果我的方法论都是湿的,我会对其他事情采取其他方式。我希望我不必使用笨重的反射代码。 谢谢你的阅读。
答案 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的回答是正确的