特殊的类之注解

注解

    • 注解的入门和作用以及原理
      • 示例
      • 注解的方法名就是属性名
      • @Retention的作用
      • @Target的作用
      • 注解的属性设置默认值

天生我材必有用,千金散尽还复来。——唐代李白《将进酒》

在Java中,注解实际上是特殊类型的接口,当我们使用注解时,编译器会为我们自动创建一个实现该接口的类,该类的属性对应注解中定义的属性。在运行时,当我们获取注解实例时,实际上获取的是这个类的实例,该实例中保存了注解的属性值。

具体来说,当我们定义一个注解时,Java会为其生成一个对应的注解类型。这个类型在编译期已经确定了,它的属性都是在编译期确定的,不能动态添加或修改。

注解的入门和作用以及原理

注解是Java语言中的一种元数据,它提供了一种结构化的方式来添加关于代码的信息和元数据,这些信息可以用来编译、部署和运行时进行处理。注解提供了一种简单的方法来将元数据附加到代码中,并能够被编译器、开发工具和其他程序进行读取和处理。

注解有很多作用,其中最常见的作用是为Java代码提供一些额外的信息,以便在编译、部署和运行时进行处理。例如,Java标准库中提供了许多内置的注解,如@Override、@Deprecated和@FunctionalInterface等。这些注解可以让编译器进行静态检查,并在编译器发现代码错误时发出警告或错误。

此外,注解也可以用于自定义的元数据处理。通过使用自定义注解,开发人员可以为自己的代码添加元数据,然后使用反射和其他技术来处理该元数据。例如,Spring框架中使用了大量的注解,如@Service、@Autowired和@Transaction等,来对应用程序进行配置和管理。

注解的原理是在Java中使用了反射技术,可以在运行时获取类、方法和字段的元数据信息。通过使用Java反射API,程序可以访问这些注解,并对其进行解析和处理。在运行时,程序可以使用注解来改变代码的行为或配置,以满足不同的需求。

总之,注解是Java语言中的一个强大的功能,它为Java代码提供了一种简单和灵活的方式来添加元数据和配置信息。通过深入理解注解的基本概念和原理,开发人员可以更好地利用这一功能来编写更加强大和灵活的Java代码。

示例

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
    String value();
}

public class MyClass {

    @MyAnnotation("Hello, World!")
    public void myMethod() {
        System.out.println("My Method");
    }

    public static void main(String[] args) throws Exception {
        MyClass obj = new MyClass();
        Class<?> cls = obj.getClass();
        MyAnnotation annotation = cls.getMethod("myMethod").getAnnotation(MyAnnotation.class);
        System.out.println(annotation.value()); // Output: Hello, World!
    }
}

在这个示例中,我们首先定义了一个自定义注解 @MyAnnotation,它有一个属性 value

接着,我们在 MyClass 类中的 myMethod() 方法上使用了 @MyAnnotation 注解,其中 value 属性的值为 "Hello, World!"

main() 方法中,我们使用反射获取 myMethod() 方法上的 @MyAnnotation 注解,并输出其 value 属性的值。

通过运行上述代码,我们可以得到以下输出:

Hello, World!

这个示例演示了如何使用自定义注解,并利用反射来获取注解信息。实际应用中,我们可以使用自定义注解来添加各种元数据信息,然后在程序运行时对这些元数据进行解析和处理,从而实现更加灵活和可配置的代码逻辑。

注解的方法名就是属性名

在Java注解中,方法名就是属性名。在Java注解中,属性是通过方法定义的,注解中的每个方法对应一个属性。

例如,下面是一个定义了两个属性的注解示例:

public @interface MyAnnotation {
    String name();
    int age();
}

在这个注解中,有两个属性:nameage,分别对应String类型和int类型。

我们可以通过使用注解并传入属性值来使用它。例如,下面的代码演示了如何使用上述注解:

@MyAnnotation(name = "John Doe", age = 30)
public class MyClass {
    // ...
}

在这个例子中,我们在MyClass类上使用了@MyAnnotation注解,并传入了nameage属性的值。这些值会在编译时存储在注解实例中,以便在运行时访问。

在访问注解属性时,我们可以像调用Java对象的方法一样,使用属性名来访问属性的值。例如,下面的代码演示了如何访问MyClass类上的@MyAnnotation注解的属性:

MyAnnotation annotation = MyClass.class.getAnnotation(MyAnnotation.class);
String name = annotation.name(); // "John Doe"
int age = annotation.age(); // 30

在这个例子中,我们使用反射来获取MyClass类上的@MyAnnotation注解,并通过注解实例的方法访问其属性的值。

因此,可以看出Java注解中的方法名就是属性名。通过定义不同的方法名和类型,我们可以为注解定义不同类型的属性,以满足不同的需求。

@Retention的作用

@Retention(RetentionPolicy.RUNTIME) 是Java注解中的一个元注解,它用来指定注解的保留策略。

Java注解有三种保留策略:

  1. RetentionPolicy.SOURCE:注解只在源代码中保留,在编译时会被忽略。

  2. RetentionPolicy.CLASS:注解在编译时会被保留,但在运行时不可用。

  3. RetentionPolicy.RUNTIME:注解在运行时也会保留,可以通过反射机制获取注解信息。

@Retention(RetentionPolicy.RUNTIME) 表示该注解将在运行时保留,可以通过反射获取注解信息。

这个元注解通常用于自定义注解时,如果我们想要在运行时使用该注解,就必须指定该注解的保留策略为 RetentionPolicy.RUNTIME。如果没有指定保留策略,默认为 RetentionPolicy.CLASS

例如,下面是一个自定义注解,并使用 @Retention(RetentionPolicy.RUNTIME) 指定了保留策略:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // ...
}

在这个注解中,我们使用了 @Retention(RetentionPolicy.RUNTIME) 元注解,指定了该注解的保留策略为 RetentionPolicy.RUNTIME

通过指定 @Retention(RetentionPolicy.RUNTIME) 元注解,我们可以在运行时使用该注解,并通过反射机制获取注解信息。例如,下面是一个示例,演示了如何使用反射获取一个类上的 @MyAnnotation 注解信息:

MyAnnotation annotation = MyClass.class.getAnnotation(MyAnnotation.class);

在这个示例中,我们使用 getAnnotation() 方法获取 MyClass 类上的 @MyAnnotation 注解信息,因为该注解的保留策略为 RetentionPolicy.RUNTIME,所以在运行时可以通过反射获取注解信息。

因此,通过指定 @Retention(RetentionPolicy.RUNTIME) 元注解,我们可以在运行时使用注解,并通过反射机制获取注解信息,从而实现更加灵活和可配置的代码逻辑。

@Target的作用

@Target(ElementType.METHOD) 是Java注解中的一个元注解,它用来指定注解的使用目标。具体来说,它指定了注解可以用于哪些程序元素上。

Java注解可以用于多种程序元素上,例如类、方法、字段等。@Target 元注解用于指定注解可以用于哪些程序元素上,它的参数是一个枚举类型 ElementType,表示注解可以用于哪些程序元素上。

在这个例子中,@Target(ElementType.METHOD) 意味着该注解只能用于方法上。

例如,下面是一个示例,演示了如何定义一个只能用于方法上的注解:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyMethodAnnotation {
    // ...
}

在这个示例中,我们使用了 @Target(ElementType.METHOD) 元注解,指定了该注解只能用于方法上。这意味着我们不能将该注解用于其他程序元素上,如类、字段等。

通过指定 @Target 元注解,我们可以更加精确地控制注解的使用范围,从而避免在不合适的程序元素上使用注解,提高代码的可读性和可维护性。

总之,@Target(ElementType.METHOD) 的作用是指定注解只能用于方法上。通过使用 @Target 元注解,我们可以更加精确地控制注解的使用范围,从而提高代码的可读性和可维护性。

注解的属性设置默认值

注解的属性可以设置默认值。在Java注解中,我们可以为属性指定默认值,这样在使用注解时,如果没有为属性赋值,就会使用默认值。

为注解属性设置默认值非常简单,只需要在注解属性声明时为其赋值即可。例如,下面是一个定义了默认值的注解示例:

public @interface MyAnnotation {
    String name() default "John";
    int age() default 30;
}

在这个注解中,有两个属性:nameage,分别对应String类型和int类型。同时,这两个属性都有默认值,name的默认值为"John"age的默认值为30

在使用注解时,我们可以只为部分属性赋值,未赋值的属性将使用默认值。例如,下面是一个使用@MyAnnotation注解的示例:

@MyAnnotation(name = "Jane")
public class MyClass {
    // ...
}

在这个例子中,我们在MyClass类上使用了@MyAnnotation注解,并为name属性赋值为"Jane"。由于我们没有为age属性赋值,所以age属性将使用默认值30

如果我们要获取注解属性的值,可以使用反射机制访问注解实例的属性。例如,下面是一个示例,演示了如何使用反射访问@MyAnnotation注解的属性:

MyAnnotation annotation = MyClass.class.getAnnotation(MyAnnotation.class);
String name = annotation.name(); // "Jane"
int age = annotation.age(); // 30

在这个示例中,我们使用反射来获取MyClass类上的@MyAnnotation注解,并访问其nameage属性的值。由于我们为name属性赋值为"Jane",所以name属性的值为"Jane",而age属性的值为默认值30

因此,注解的属性可以设置默认值,这样在使用注解时,如果没有为属性赋值,就会使用默认值。

你可能感兴趣的:(java基础,java,spring,mybatis)