注解的可继承问题

@XXX如果在父类意已经标注上去的话,能不能被子类继承到要看源码里面是否有@Inheritance

例如:


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {
    String value() default "";
}
所以@Service是不能被继承的,子类想要实现@Service ,必须自己定义


抱歉没找到jdk源码里面可以继承的例子

反正实现自定义注解的时候,如果想要实现注解的继承只需要加上@Inheritance


 Inheritance 注释

  OpenJPA 是一个基于注释的持久化框架,对持久化的大多数元信息都只需要为实体类提供相应的注释。开发者使用注释描述实体和数据库表之间的映射,也采用注释描述对象继承关系的持久化。javax.persistence.Inheritance 注释用来指定对象继承关系持久化的方式。它的 strategy 属性用于指定持久化对象继承关系在关系数据库中的表现形式,可选择项包括 SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS。它们三个都是 javax.persistence.InheritanceType 中定义的常量。

  SINGLE_TABLE

  strategy 设置为 SINGLE_TABLE 选项表示所有类及其子类保存在同一个数据库表中,对象的类型使用表中的特殊字段 DTYPE 进行识别。

  TABLE_PER_CLASS

  strategy 设置为该选项表示每个类使用一个表。

  JOINED

  strategy 设置为该选项表示父类和子类分别保存在不同的数据库表中,子类中不保存父类对应数据库表中已有的属性,仅通过主键进行关联。

  javax.persistence.Inheritance 注释是类级别的注释。需要为每一个成为父类的实体类提供 javax.persistence.Inheritance 注释并且指定 strategy 属性。在同一个企业应用中,开发者可以根据实际情况选择这三种策略中的一种,或者是几种同时使用。

  对象继承关系的持久化和查询


已标记关键词 清除标记
问题:如果我想通过子类来获得父类中方法上的注解,怎么做? 代码如下: //注解类 @Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)//运行时加载,其他状态都不能打印结果 @Inherited //不能继承接口,只能继承类 @Documented public @interface Description { String value(); } //被注解的类 @Description("I am Person") public class Person { @Description("I am Person Method") public String name(){ return null; }; public int age(){ return 0; }; @Deprecated public void sing(){ }; } //被注解类的子类 public class Child extends Person{ @Override public String name() { return null; } @Override public int age() { return 0; } @Override public void sing() { } } //打印注解 public class ParseAnn { public static void main(String[] args){ //1使用类加载器加载类 try { Class c=Class.forName("com.ann.test.Person"); //2找到类上面的注解 boolean isExist=c.isAnnotationPresent(Description.class);//判断类上是否存在Description这个注解 if(isExist){ //3拿到注解实例 Description d = (Description) c.getAnnotation(Description.class); System.out.println(d.value()); } //4找到方法上的注解 Method[] ms = c.getMethods(); for (Method m : ms) { //如果在这个元素上存在指定类型的注释,则返回真,否则为假。 boolean isMExist=m.isAnnotationPresent(Description.class); if(isMExist){ //如果存在此注释,则返回此元素的指定类型的注释,否则为空。 Description d = m.getAnnotation(Description.class); System.out.println(d.value()); } } } catch (ClassNotFoundException e) { e.printStackTrace(); } } }
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页