2013-05-04 67 views
2

我遇到麻烦的概念是如何将令牌(例如Apple.class)传递给方法,然后访问子类的静态方法,以便检索有关子类的通用信息?(在这种情况下,a一个苹果的通用图像)如何从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

你可以使用反射,但它不会更简单,将其更改为'arrayManager(Class <?extends Food> foodToken,Image img)'? – nullptr 2013-05-04 17:44:15

+0

很棒的建议,我没有想到这个想法。尽管它确实降低了令牌的效用。 – user2350212 2013-05-05 01:05:59

回答

0

可以与反思这样做:(假设你在同一个包是)

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

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

+0

这是一个很好的答案,我不知道这可以做到。谢谢。我能看到的唯一缺点是,如果'getImage()'方法被重命名,它会中断链接。 – user2350212 2013-05-05 01:01:48

0

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

结帐反映出具有完全配方举例:https://github.com/gondor/reflect

这样做与反思:

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

如果你不想使用任何库,然后@马克长尾答案是正确的