首页 > 编程知识 正文

脚本注入,java自定义注解使用场景

时间:2023-05-06 00:12:13 阅读:147828 作者:2410

@Inherited注释在Ava中的运用

在我们定制注释(Annotation )时,将自定义注释标记为父类不会被子类继承,但在定义注释时通过将@Inherited注释标记为自定义注释,可以将它们

自定义注释代码为以下:

package com.xdf.annotation;

import Java.lang.annotation.inherited;

import Java.lang.annotation.retention;

@Inherited

@ retention (Java.lang.annotation.retention policy.runtime ) ) ) ) )。

公共@ interfaceinheritedannotation {

字符串值(;

}

定义抽象的父类

代码是下一个:

package com.xdf.annotation;

publicabstractclassabstractparent {

@ inherited annotation (value=' parentabstractmethod ' ) ) ) ) ) )。) ) ) )。

publicabstractvoidabstractmethod (;

@ inherited annotation (value=' parent ' SDO extends ' ) ) ) ) ) ) ) ) ) )。

公共void do extends (

system.out.println (abstractparentdoextends . ' );

}

}

我们将定制的注释附加到父类的方法上。

然后定义继承抽象父类“AbstractParent”的子类

代码是下一个:

package com.xdf.annotation;

publicclasssubclassimplextendsabstractparent {

@Override

公共语音辅助方法(

System.out.println;

}

}

子类实现了abstractMethod抽象方法,并且没有重写doExtends方法。

测试类代码为以下:

package com.xdf.annotation;

import java.lang.reflect.Method;

publicclassinheritedannotationtest {

publicstaticvoidmain (string [ ] args ) throws SecurityException,NoSuchMethodException {

Class clazz=SubClassImpl.class;

//abstractMethod

method method=clazz.get method (abstract method ),new Class[]{} );

method.isannotationpresent (inherited annotation.class ) }

inheritedannotationma=method.get annotation (inherited annotation.class );

System.out.println (由子类实现的抽象方法由父类抽象方法的Annotation继承。 其信息如下。 ();

system.out.println(ma.value ) );

}else{

由System.out.println ('子类实现的抽象方法不由父类抽象方法的Annotation '继承。

}

methodmethodoverride=clazz.get method (' do extends ',new Class[]{} );

方法概述. isannotationpresent (inherited annotation.class ) }

inheritedannotationma=method override.get annotation (inherited annotation.class );

System.out.println (子类的doExtends方法由父类的doExtends方法的Annotation继承。 其信息如下。 ')

system.out.println(ma.value ) );

}else{

System.out.println (子类的doExtends方法是父类的doExtends方法的Annotation );

}

}

}

结果如下:

子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的

子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:

部件号为扩展

上述代码执行的结果可以得出以下结论。

1 .如果子类继承了父类并复盖了父类的带注释的方法,则父类方法的注释不会被子类继承。

2 .如果子类继承了父类,并且没有重写父类中的带注释的方法,则父类方法的注释将被子类继承。 这意味着可以在子类中获取父类方法的注释。

但是……但是,即使删除自定义评论的@Inherited评论并运行,结果也是一样的。 也就是说,此@Inherited注释完全不起作用。 这是什么?

然后,将不带@Inherited注释的自定义注释标记为类级别(不是方法级别),并按如下方式修改抽象父类:

package com.xdf.annotation;

@ inherited annotation (value=' parent ' )//将自定义注释标记为父类

publicabstractclassabstractparent {

@ inherited annotation (value=' parentabstractmethod ' ) ) ) ) ) )。) ) ) )。

publicabstractvoidabstractmethod (;

@ inherited annotation (value=' parent ' SDO extends ' ) ) ) ) ) ) ) ) ) )。

公共void do extends (

system.out.println (abstractparentdoextends . ' );

}

}

然后在测试类的main方法中添加了以下的测试代码:

if (clazz.isannotationpresent (inherited annotation.class ) )

inheritedannotationcla=clazz.get annotation (inherited annotation.class );

System.out.println (子类由父类上的Annotation继承,其信息如下: ();

system.out.println(cla.value ) );

}else{

System.out.println ('子类没有被父类的Annotation '继承;

}

如果执行main方法得到:

子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的

子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:

部件号为扩展

子类没有向父类继承Annotation

运行结果表明,子类没有继承父类级别的注释。 因此,我将@Inherited注释标记为自定义注释,然后尝试运行,得到了以下结果:

子类实现中的抽象方法不是由父类中的抽象方法的Annotation继承的

子类的doExtends方法由父类的doExtends方法的Annotation继承,其信息如下:

部件号为扩展

子类由父类的Annotation继承,其信息如下:

父级

请注意执行结果。 子类继承父类级别的注释。

这说明了什么?

说明在类级别应用这种带@Inherited注释的自定义注释和在方法级别应用是不同的,如果在类级别标记带@Inherited注释的自包含注释,则子类将在父类级别进行标记

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。