目录
注解的本质
注解的意思就是让其他程序根据注解信息,来决定该怎么执行该程序。
java注解是一种元数据标记,用于提供程序元素的说明和注释信息。
注解本身并不提供额外的语义,而只是纯粹的元数据。
它们可以用于为编译器,开发工具,框架等提供额外的信息,但·不会影响程序的运行。
(在Java中先学习使用注解能让你更好的了解注解)
元注解
java中有四个元注解,但是在基础阶段重要的只有@Target和@Retention两个另外两个是@Documented和@Repeatable
元注解的作用就是:修饰注解的注解。
@Target作用:声明被修饰的注解只能在哪些地方使用
@Target(ElementType. TYPE)//TYPE可以更换,增添
- TYPE:类,接口
- FIELD:成员变量
- METHOD:成员方法
- PARAMETER:方法参数
- CONSTRUCTOR:构造器
- LOCAL_VARIABLE:局部变量
@Retention作用:声明注解的保留周期
@Retention(RetentionPolicy.RUNTIME)
- RUNTIME:一直保留到运行阶段
- CLASS:保留到字节码文件阶段,运行阶段不存在
- SOURCE:只做用在源码阶段,字节码文件中不存在
注意以上是元注解,是定义注解的注解
使用注解
@Override是Java中的一个常用注解,用于指示一个方法是重写了父类或者实现了接口中的方法。使用@Override注解可以帮助编译器检查代码的正确性,避免因方法签名不匹配导致的错误。下面是一个使用@Override注解的案例:
假设我们有一个父类Animal和一个子类Dog,Animal类中有一个名为“makeSound”的方法,Dog类需要重写这个方法。我们可以使用@Override注解来表明Dog类中的“makeSound”方法是重写了Animal类中的方法,代码如下:
class Animal { public void makeSound() { System.out.println("The animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("The dog barks"); } }
在上面的代码中,我们在Dog类的makeSound方法上添加了@Override注解,表明该方法重写了Animal类中的makeSound方法。当我们调用Dog类的makeSound方法时,会输出“The dog barks”。如果我们没有在Dog类的makeSound方法上添加@Override注解,而该方法又没有正确地重写Animal类中的makeSound方法(例如方法签名不匹配),编译器将会报错。使用@Override注解可以帮助我们避免这类错误,提高代码的可读性和可维护性。同时,@Override注解也可以被用在接口实现的方法上,表明该方法实现了接口中定义的方法。
需要注意的是,在使用@Override注解时,方法的签名(包括方法名、参数类型和返回类型)必须与父类或接口中被重写或被实现的方法的签名完全一致,否则会编译失败。
定义一个注解
如何写一个注解?写一个注解就需要用到关键词@interface
写注解和写接口有一些相似,都是以声明的方式出现,可以用来表示某种声明信息
要自己写一个注解需要以下几步
- 创建一个新的java类,作为注解的代码定义
- 在类前面添加@interface关键字,表示该类是一个注解类型
- 在类中定义注解的元素,这些元素可以用来存储注解的值。元素可以使常量,枚举类型,类类型,整数类型,等类型,也可以是其他注解类型
- 为注解元素指定默认值,这样在使用注解时如果没有提供该元素的值,就会使用默认值
- 为注解添加一些元数据(元注解也是一种元数据)(可加可不加)例如用于指定该注解的作用范围·,是否在代码中显示,保留周期
- 将注解应用到需要使用的地方,例如方法,类,字段
下面是一个示例
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MyAnnotation { String value() default ""; int count() default 0; }
这个注解有两个元素,分别是value和count,他们的默认值分别是空字符串和0.该注解的作用范围是类型(TYPE),也就是用于类,接口或者枚举声明。同时,该注解在运行时(RUNTIME)被保留。可以这样使用该注解
@MyAnnotation(value = "hello", count = 3) public class MyClass { // class body }
再看一个@Test注解
在Java中,使用
@Test
注解的例子通常出现在JUnit测试框架中。@Test
注解用于标记一个方法作为测试用例。这个junit先不用管只要知道@Test的作用是(当你将@Test注解添加到一个方法上时,这个方法就变成了一个测试用例,java会自动识别并执行它。没有添加@Test的就不会被执行)下面是一个简单的例子:import org.junit.Test; import static org.junit.Assert.assertEquals; public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); int result = calculator.add(2, 3); assertEquals(5, result); } public void testSubtraction() { Calculator calculator = new Calculator(); int result = calculator.subtract(5, 3); if (result != 2) { System.out.println("Test failed"); } } }
在上面的例子中,我们同时使用了使用@Test注解的testAdd方法和没有使用@Test注解的testSubtraction方法。使用@Test注解的testAdd方法会被JUnit自动发现并执行,而没有使用@Test注解的testSubtraction方法则不会被执行。如果你想执行testSubtraction方法,可以在该方法上添加@Test注解。