@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Inherited
public @interface InheritedAnn {
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface NonInheritedAnn {
}
上列兩個Annotation僅差別在有無@Inherited。簡單看一下@Inherited對extends跟implements的影響@InheritedAnn
@NonInheritedAnn
public class Parent {
@InheritedAnn
@NonInheritedAnn
public void notBeOverrided() {}
@InheritedAnn
@NonInheritedAnn
public void beOverrided() {}
}
public class Child extends Parent {
@Override
public void beOverrided() {}
}
@InheritedAnn
public interface SimpleInterface {
@InheritedAnn
void simple();
}
public class SimpleImpl implements SimpleInterface {
@Override
public void simple() {}
}
寫個Test吧import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.fail;
import java.lang.reflect.Method;
import org.junit.Test;
public class AnnTest {
/**
* 驗証具有@Inherited 的Annotation可以透過extends保留在subclass中
*/
@Test
public void testConcreteClassInheritence() throws Exception {
//測試Annotated Type,僅具有@Inherited會被保留
assertNotNull(Child.class.getAnnotation(InheritedAnn.class));
assertNull(Child.class.getAnnotation(NonInheritedAnn.class));
//測試沒被Override 的Annotated Method,無論是否有@Inherited皆會被保留
Method notBeOverrided = Child.class.getMethod("notBeOverrided", null);
assertNotNull(notBeOverrided.getAnnotation(InheritedAnn.class));
assertNotNull(notBeOverrided.getAnnotation(NonInheritedAnn.class));
//測試被Override 的Annotated Method,無論是否有@Inherited皆不會被保留
Method beOverrided = Child.class.getMethod("beOverrided", null);
assertNull(beOverrided.getAnnotation(InheritedAnn.class));
assertNull(beOverrided.getAnnotation(NonInheritedAnn.class));
}
/**
* 驗証即便具有@Inherited 的Annotation仍無法透過implements interface保留
*/
@Test
public void testInterfaceInheritence() throws Exception {
//無論是Type或Method皆無法保留Annotation
//測試Annotated Type
assertNull(SimpleImpl.class.getAnnotation(InheritedAnn.class));
//測試Annotated Method
Method simple = SimpleImpl.class.getMethod("simple", null);
assertNull(simple.getAnnotation(InheritedAnn.class));
}
}
要說的都寫在Test中...