前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java5 注解(Annotation)

Java5 注解(Annotation)

原创
作者头像
HLee
修改2021-09-10 11:23:23
6870
修改2021-09-10 11:23:23
举报
文章被收录于专栏:房东的猫房东的猫

简介

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。注解是结合反射来运行的,注解相当于一个标识,不做具体的操作,具体操作是由反射来完成的。

Java语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容。 当然它也支持自定义 Java 标注。

Annotation

@Target注解

说明:指定注解针对的地方

代码语言:javascript
复制
@Target({ElementType.TYPE})
说明:
    ElementType.TYPE:针对类、接口
    ElementType.FIELD:针对成员变量
    ElementType.METHOD:针对成员方法
    ElementType.PARAMETER:针对方法参数
    ElementType.CONSTRUCTOR:针对构造器
    ElementType.PACKAGE:针对包

@Retention注解

说明:指定注解的保留域

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
说明:
    RetentionPolicy.RUNTIME:由JVM读取,运行时使用
    RetentionPolicy.SOURCE:源代码级别,由编译器处理,处理之后就不再保留
    RetentionPolicy.CLASS:注解信息保留到类对应的class文件中

自定义注解

定义注解

说明:分别定义注解方法、注解类、注解属性。

代码语言:javascript
复制
package com.java.master.注解;

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitClass {
}


package com.java.master.注解;

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitMethod {

}


package com.java.master.注解;

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

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InitValue {

    String value();
}

添加注解

说明:在这个类上分别使用类注解、方法注解、属性注解。

代码语言:javascript
复制
@InitClass
@Getter
@Setter
@ToString
public class InitDemo {

    @InitValue("1")
    private Integer id;

    @InitValue("小白")
    private String name;

    @InitMethod
    public void init() {
        System.out.println("我是注解方法");
    }

    public void start() {
        System.out.println("我是普通方法");
    }
}

注解使用

代码语言:javascript
复制
public class AnnotationTest {
    
    public static void main(String[] args) throws Exception{

        // 反射获取class对象
        Class clazz = Class.forName("com.java.master.注解.InitDemo");

        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            // 判断方法是否添加注解通过这个判断
            boolean isInitMethod = method.isAnnotationPresent(InitMethod.class);
            if (isInitMethod) {
                method.invoke(clazz.newInstance());
            }
        }

        // 反射获取class对象
        Class<InitDemo> aClass = InitDemo.class;

        // 判断类是否添加注解通过这个判断
        InitClass annotation = aClass.getAnnotation(InitClass.class);
        if (null != annotation) {
            System.out.println("InitDemo 添加了注解 InitClass");

            Constructor<InitDemo> constructor = aClass.getConstructor(null);
            InitDemo initDemo = constructor.newInstance(null);

            // 判断属性是否添加注解通过这个判断
            Field[] fields = aClass.getDeclaredFields();
            for (Field field : fields) {
                InitValue initValue = field.getAnnotation(InitValue.class);
                if (null != initValue) {
                    System.out.println(field.getName() + "添加了注解并且设置了初始值: " + initValue);
                    // 暴力反射
                    field.setAccessible(true);
                    // 判断属性类型
//                    System.out.println(field.getType().getName());
                    if (field.getType().getName().equals("java.lang.Integer")) {
                        Integer val = Integer.parseInt(initValue.value());
                        field.set(initDemo, val);
                    } else {
                        field.set(initDemo, initValue.value());
                    }
                }
            }
            System.out.println(initDemo);
        } else {
            System.out.println("无法创建InitDemo对象");
        }
    }
}

输出:
我是注解方法
InitDemo 添加了注解 InitClass
id添加了注解并且设置了初始值: @com.java.master.注解.InitValue(value=1)
name添加了注解并且设置了初始值: @com.java.master.注解.InitValue(value=小白)
InitDemo(id=1, name=小白)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • Annotation
    • @Target注解
      • @Retention注解
      • 自定义注解
        • 定义注解
          • 添加注解
            • 注解使用
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档