首页  >  文章  >  Java  >  Java @Inherited

Java @Inherited

WBOY
WBOY原创
2024-08-30 16:22:26354浏览

Java中的@inherited是一个注解,用于标记一个注解要继承给被注解类的子类。 @inherited 是一个内置注释,我们知道注释就像一个代表元数据的标签,它向编译器提供附加信息。与 Javadoc 中存在的内置注释相同,可以在 java.lang.java 文档中创建另一个元注释。实际上有两种类型的注释,一种类型的注释应用于 java 代码,如 @override,另一种类型的注释应用于其他注释,如 @target @inherited。所以@inherited是一个注释,应用于我们想要创建子类或我们想要继承以使另一个用户定义注释的其他注释。

广告 该类别中的热门课程 JAVA 掌握 - 专业化 | 78 课程系列 | 15 次模拟测试

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

语法

java中@inherited的语法是-

@Inherited
public @interface MyAnnotation {// code of the MyAnnotation
}
@MyAnnotation
public class SuperClass {
// code of the SuperClass }
public class SubClass extends SuperClass { // code of the SubClass }

如上面的语法,类SubClass继承自注解@MyAnnotation,因为它继承自SuperClass,而SuperClass有一个@MyAnnotation注解。

@Inherited 在 Java 中如何工作?

@Inherited 注解用于或注解到注解(如上述语法中的 MyAnnotation),@interface 应为其添加前缀。接下来,可以在需要应用@MyAnnotation 的地方使用此注释(MyAnnotation)。这些注释可以在元素声明之前应用,也可以应用于程序的任何元素,如变量、类、构造函数、方法等。当此用户定义的注释被注释在超类上时,它会自动继承到子类(如上面语法中的子类),正如我们在下面的示例中看到的。

在 Java 中实现 @Inherited 注解的示例

接下来,我们编写java代码来更清楚地理解@Inherited注解,下面的示例中我们使用@Inherited注解在子类中从超类继承,如下 –

示例#1

首先,我们创建一个注解接口@MyAnnotation,它有两个字段,名称和代码。

代码://MyAnnotation.java

package demo;
import java.lang.annotation.Inherited;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Inherited
@Target ({ElementType.TYPE, ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String name () default "unknown";
String code () default " ";
}

接下来,我们创建一个超类来通过注释任何类、方法或变量来使用上述注释,并提供状态名称和状态代码。

代码://Super.java

package demo;
import demo.MyAnnotation;
@MyAnnotation (name = "Karnataka", code = "KA")
public class Super
{
public String getstateinfo ()
{
return null;
}
}

接下来,我们使用注解,因为它是元数据,这意味着我们应该能够获取这个元数据或信息,以便在需要时使用注解信息。

代码://Demo.java

//as sub class
package demo;
import demo.MyAnnotation;
import demo.Super;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
public class Demo extends Super
{
public static void main ( String[] arg ) throws Exception
{
new Super ();
Class <Super>obj = Super.class;
getstateinfo (obj);
Method m = obj.getMethod ("getstateinfo", new Class[]{});
getstateinfo (m);
}
static void getstateinfo (AnnotatedElement e)
{
try
{
System.out.println ("Finding annotations on " + e.getClass ().getName ());
Annotation[] annotations = e.getAnnotations ();
for (Annotation a : annotations)
{
if (a instanceof MyAnnotation)
{
MyAnnotation stateInfo = (MyAnnotation) a;
System.out.println("Name of Annotation :" + stateInfo.annotationType ());
System.out.println("State Name :" + stateInfo.name ());
System.out.println("State code :" + stateInfo.code ());
System.out.println(new Demo ().getClass ().getAnnotation (MyAnnotation.class));
System.out.println(new Super ().getClass ().getAnnotation (MyAnnotation.class));
}
}
} catch (Exception ex)
{
System.out.println( ex );
}
}
}

输出:当我们运行 Demo.java 类时,输出为。

Java @Inherited

说明: 如上面的代码所示,创建了 MyAnnotation 注解,并由 @Inherited 进行注解。在超类中,MyAnnotation 注释由 @MyAnnotation 语句使用并注释到类中。并且创建了另一个类Demo,它是Superclass的子类,因为它扩展为Superclass。再往前,在 Demo 类的 main() 方法中,创建了 Superclass 的一个对象,并访问其方法 getstateinfo(),通过该方法迭代其所有注释并检查该注释是否是 MyAnnotation 的,如果是则打印一些正如我们在上面看到的信息。但一件重要的事情是,Demo 类或其任何元素没有注释到 MyAnnotation,但它仍然显示 MyAnnotation 注释到此类,因为它是超类固有的,而超类继承了 MyAnnotation。

接下来,我们重写上面的java代码,以便更清楚地理解@Inherited注解,下面的例子中我们不会使用@Inherited注解来注解MyAnnotation(如上例中创建的注解)来检查该注解是否被继承是否位于其超类的子类中,如下所示 –

示例#2

我们将保持 Super.java 和 Demo.java 类与上面相同,在这些类中不进行任何更改,但在 MyAnnotation.java 类中,我们做很少的更改,只是删除 @Inherited 注释以从 MyAnnotation 进行注释,正如我们在下面看到的 –

代码://MyAnnotation.java

package demo;
import java.lang.annotation.Inherited;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// no @Inherited
@Target ({ElementType.TYPE, ElementType.METHOD})
@Retention (RetentionPolicy.RUNTIME)
public @interface MyAnnotation
{
String name () default "unknown";
String code () default " ";
}

输出: 接下来,当我们运行 Demo.java 类时,输出为。

Java @Inherited

说明:如上面的输出,我们可以看到,在状态代码之后,打印了“null”值,即语句“new  Demo ().getClass () 的返回值” .getAnnotation(MyAnnotation.class)”,这意味着演示类没有从其超类继承(或注解)任何MyAnnotation注解,因为@Inherited注解没有注解到MyAnnotation以在子类中继承它。

结论

java中的@inherited是一个应用于另一个注解的内置注解。它用于标记要继承到被注释类的子类的注释。 @inherited 在 java.lang.annotation.Inherited 包中可用。

以上是Java @Inherited的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn