java类上的接口

java类上的接口,java,Java,我正在编写一些东西,它使用javax.xml.bind包查找注释,例如@xmlement、@xmlementref和@xmldattribute。这三个类都有一个required()方法,该方法返回一个布尔值,我需要对此进行检查。因此,我要: Boolean required; for (Annotation anno : theAnnotations) { if (anno.annotationType().equals(XmlElement.class)) { req

我正在编写一些东西,它使用
javax.xml.bind
包查找
注释
,例如
@xmlement
@xmlementref
@xmldattribute
。这三个类都有一个
required()
方法,该方法返回一个布尔值,我需要对此进行检查。因此,我要:

Boolean required;
for (Annotation anno : theAnnotations) {
    if (anno.annotationType().equals(XmlElement.class)) {
        required = ((XmlElement) anno).required();
    }
    else if (anno.annotationType().equals(XmlElementRef.class)) {
        required = ((XmlElementRef) anno).required();
    }
    else if (anno.annotationType().equals(XmlAttribute.class)) {
        required = ((XmlAttribute) anno).required();
    }               
}
这段代码似乎毫无意义地重复。我想在
xmlement
xmlementref
xmldattribute
上创建一个接口,以指定这三个接口具有
required()
方法。这样我就可以做到:

for (Annotation anno : theAnnotations) {
    required = ((MyInterface) anno).required();             
}
显然,我无法访问
javax.xml.bind.annotation.xmlement
xmlementref
xmldattribute
的源代码。有没有办法告诉编译器这些内置类实现了MyInterface


我发现了以下C#问题:这似乎很接近,但我不确定我是否能很好地阅读C#,而且包装类的想法似乎不适合我的使用

嗯,包装类的思想是适用的。下面是示例Java代码(将类
XML
XML2
视为不可修改):


最坏情况下,您可以创建枚举

public enum XmlAnnotationTypes {
    XML_ELEMENT(XmlElement.class),
    XML_ELEMENT_REF(XmlElementRef.class),
    XML_ATTRIBUTE(XmlAttribute.class);

    private Class<?> clazz;

    private XmlAnnotationTypes(Class<?> clazz) {
        this.clazz = clazz;
    }

    public Class<?> getClazz() {
        return clazz;
    }
}

for(Annotation anno : theAnnotations) {
    for(XmlAnnotationTypes xmlAnnoType : XmlAnnotationtypes.values()) {
        if(xmlAnnoType.getClazz() == anno.annotationType()) {
            try {
                 Method method =  xmlAnnoType.getClazz().getMethod("required");
                 method.setAccessible(true);
                 required = (Boolean)method.invoke(anno);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}
公共枚举XmlAnnotationTypes{ XML_元素(xmlement.class), XML_ELEMENT_REF(xmlementref.class), XML_属性(xmldattribute.class); 私人课堂; 私有XmlAnnotationTypes(类clazz){ this.clazz=clazz; } 公共类getClazz(){ 回击声; } } 对于(注释注释注释:注释){ 对于(XmlAnnotationTypes xmlAnnoType:XmlAnnotationTypes.values()){ if(xmlAnnoType.getClazz()==anno.annotationType()){ 试一试{ 方法Method=xmlAnnoType.getClazz().getMethod(“必需”); 方法setAccessible(true); 必需=(布尔)方法.invoke(anno); }捕获(无此方法例外){ e、 printStackTrace(); }捕获(非法访问例外e){ e、 printStackTrace(); }捕获(调用TargetException e){ e、 printStackTrace(); } } } }
或者按照Victor所说的做,创建一个包含您想要封装的类的适配器类,为这三个容器类提供一个公共接口,然后如果所包含的类的
是您要查找的,那么在
required()周围调用适配器中的
required()包装器
所包含类的
。公平地说,这是一个不太俗气的解决方案。

如果它们都有一个
required()
方法来做同样的事情,为什么不创建一个它们都从中扩展出来的父类呢?@Danny我想他的观点是他无法访问这些类来更改它们。不,在Java中“修改”给定类的结构是不可能的。而且也不支持“duck-typing”。因此,您几乎被现在得到的答案所困扰(为这些“固定”类创建您自己的自定义包装器)…在讨论这样一个框架时,什么可能有效,什么可能无效。谢谢你的快速回答。现在包装类对我来说更清楚了。现在,要将我的
注释列表
分为
XMLWrapper
XMLWrapper2
,我仍然需要检查它们是
XML1
还是
XML2
,不是吗这不是违背了避免第一次代码重复的目的吗?谢谢你的回答。从你和Victor的回答来看,我似乎无法避免检查注释的实际类,但我可以避免在这三种情况中的每种情况下使用“不同”的方法。对我来说也是这样,是的。
public enum XmlAnnotationTypes {
    XML_ELEMENT(XmlElement.class),
    XML_ELEMENT_REF(XmlElementRef.class),
    XML_ATTRIBUTE(XmlAttribute.class);

    private Class<?> clazz;

    private XmlAnnotationTypes(Class<?> clazz) {
        this.clazz = clazz;
    }

    public Class<?> getClazz() {
        return clazz;
    }
}

for(Annotation anno : theAnnotations) {
    for(XmlAnnotationTypes xmlAnnoType : XmlAnnotationtypes.values()) {
        if(xmlAnnoType.getClazz() == anno.annotationType()) {
            try {
                 Method method =  xmlAnnoType.getClazz().getMethod("required");
                 method.setAccessible(true);
                 required = (Boolean)method.invoke(anno);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }
}