框架原理(注解加反射):注解

注解

概念

注解是Java 1.5 引入的,目前已被广泛应用于各种Java

框架,如Hibernate,Jersey,Spring。注解相当于是一

种嵌入在程序中的 元数据 ,可以使用注解解析工具或编

译器对其进行解析,也可以指定注解在编译期或运行期

有效。在注解诞生之前,程序的元数据存在的形式仅限

于java注释或javadoc,但注解可以提供更多功能,它不

仅包含元数据,还能作用于运行期,注解解析器能够使

用注解决定处理流程。

Annotation(注解)就是Java提供了一种元程序中的元素关

联任何信息和任何元数据 (metadata)的途径和方法。

Annotation是一个接口,程序可以通过反射来获取指定

程序元素的Annotation对象,然后通过Annotation对象来

获取注解里面的元数据。注解API非常强大,被广泛应用

于各种Java框架。

分类

根据注解参数的个数分类

1)、标记注解:一个没有成员定义的Annotation类型被

称为标记注解。

2)、单值注解:只有一个值

3)、完整注解:拥有多个值

根据注解使用方法和用途分类

1)、JDK内置系统注解

2)、元注解

3)、自定义注解

内置注解

  • * @Override :重写父类方法
    
    * @Deprecated:标记已过时,不推荐使用,但可以使用的方法
    
    * @SuppressWarnings:抑制编译器警告,该注解仅仅告知编译器,忽略它们产
    
      生了特殊警告。
    

定义注解

@interface:用来声明一个注解。注解类里的每一个方法

实际上是声明了一个配置参数。方法的名称就是参数的

名称,返回值类型就是参数的类型。可以通过default来

声明参数的默认值。

package com.lwf.annotation;

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

/**
 * @author lwf
 * @title: MyAnnotation
 * @projectName ReflectLearn
 * @description: TODO
 * @date 2020/10/2216:44
 */
@Target({ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    public String name() default "注解";
    public int value() default 0;
}

元注解(注解其他注解)

@Target:表明注解存放位置 存放枚举类型  ElementType

CONSTRUCTOR:用于描述构造器

FIELD:用于描述域

LOCAL_VARIABLE:用于描述局部变量

METHOD:用于描述方法

PACKAGE:用于描述包

PARAMETER:用于描述参数

TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention:表示需要在什么级别保存该注释信息,用于描述注解的
生命周期      存放枚举类型  RetentionPoicy

SOURCE:在源文件中有效(即源文件保留)

CLASS:在class文件中有效(即class保留)

RUNTIME:在运行时有效(即运行时保留)

@Documented :表示使用该注解的元素应被javadoc或类似工具文档化,
它应用于类型声明,类型声明的注解会影响客户端对注
解元素的使用。
@Inherited :表示一个注解类型会被自动继承,如果用户在类声明的
时候查询注解类型,同时类声明中也没有这个类型的注
解,那么注解类型会自动查询该类的父类,这个过程将
会不停地重复,直到该类型的注解被找到为止,或是到
达类结构的顶层(Object)。

代码

  1. 定义注解

    package com.lwf.annotation;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * @author lwf
     * @title: MyAnnotationPlus
     * @projectName ReflectLearn
     * @description: TODO
     * @date 2020/10/2217:47
     */
    @Target({ElementType.METHOD,ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotationPlus {
        public String value() default "lwf";
    }
    
    

    2.定义javabean并使用以上注解 MyAnnotationPlus

    package com.lwf.annotation;
    
    /**
     * @author lwf
     * @title: Student
     * @projectName ReflectLearn
     * @description: TODO
     * @date 2020/10/2217:49
     */
    public class Student {
        private int id;
        @MyAnnotationPlus
        private String name;
        @MyAnnotationPlus("上饶")
        private String city;
    
        public Student() {
        }
        public Student(int id) {
    
            this.id = id;
        }
    
        public Student(int id, String name, String city) {
            this.id = id;
            this.name = name;
            this.city = city;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", city='" + city + '\'' +
                    '}';
        }
    }
    
  2. 定义解析器,将注解中的值通过反射将值给pojo类

    package com.lwf.annotation;
    import java.lang.reflect.Field;
    /**
     * @author lwf
     * @title: LearnPlus
     * @projectName ReflectLearn
     * @description: 解析 将  MyAnnotationPlus接口值给Student的属性
     * @date 2020/10/2217:51
     */
    public class LearnPlus<T> {
        public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
            Student student=Student.class.newInstance();
            new LearnPlus<Student>().getObject("com.lwf.annotation.Student",student);
            System.out.println(student);
        }
        /**
         * MyAnnotationPlus注解解析器
         * @param str
         * @param obj
         * @return
         * @throws ClassNotFoundException
         * @throws IllegalAccessException
         */
        public  boolean getObject(String str,T obj) throws ClassNotFoundException, IllegalAccessException {
            Class c= Class.forName(str);
            for (Field field : c.getDeclaredFields()) {
                if(field.isAnnotationPresent(MyAnnotationPlus.class)){
                    field.setAccessible(true);
                    if(field.get(obj)==null){
                       field.set(obj, field.getAnnotation(MyAnnotationPlus.class).value());
                    }
                }
            }
            return true;
        }
    }
    
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务