2

我遇到问题的概念是如何将令牌(例如Apple.class)传递给方法,然后访问子类的静态方法,以便检索有关子类的通用信息?(在这种情况下是通用图像苹果)

这是一些类似 Java 的伪代码:

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().

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

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

4

2 回答 2

0

您可以使用反射轻松做到这一点。如果您想要一个简单的方法来做到这一点,我有一个开源轻量级库,它没有第三方依赖项并且位于 Maven Central 上。

Checkout Reflect 包含完整的配方示例:https ://github.com/gondor/reflect

使用反射执行此操作:

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

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

于 2013-05-04T18:57:49.273 回答
0

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

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

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

于 2013-05-04T17:43:42.610 回答