自定义注解,通过反射获得注解中的值(详细自定义注解解释)

自定义注解(@Alias):

package com.nf.lc.demo3;

import java.lang.annotation.*;

/*
    定义注解的生命周期元注解:@Retention
    RetentionPolicy.SOURCE   在编译阶段丢弃,编译结束没有任何意义
    RetentionPolicy.CLASS   在类加载时丢弃,字节码文件处理时有用,默认这种方式
☆ RetentionPolicy.RUNTIME 始终不会丢弃,运行时期也保留该注解,可以通过反射机制读取该信息
 */
@Retention(RetentionPolicy.RUNTIME)

/*
    定义注解的使用位置:@Target  默认可以使用在任何元素上
    ElementType.CONSTRUCTOR     用于描述构造器
    ElementType.FIELD           成员变量、对象、属性(包括enum实例)
    ElementType.LOCAL_VARIABLE  用于描述局部变量
    ElementType.METHOD          用于描述方法
    ElementType.PACKAGE         用于描述包
    ElementType.PARAMETER       用于描述参数
    ElementType.TYPE            用于描述类、接口(包括注解类型)或enum声明
*/
@Target(value = {ElementType.FIELD,ElementType.TYPE})

/*
    注解 : @Documented 表示是否将注解信息添加在Java文档中
*/

/*
   注解 : @Inherited 阐述了某个被标注的类型是被继承的,如果一个
   使用了 @Inherited 修饰的annotation类型被用于一个class,则这个
   annotation将被用于该class子类
*/
public @interface Alias {

    //注解成员,default表示默认值
    public String value() default "";

    //注解成员,是否参与代码生成
    public boolean isGenerator() default true;

}

实体类(Product):

package com.nf.lc.demo3;

import java.math.BigDecimal;

/**
 * 产品 bean 、实体、模型
 */
@Alias(value = "products" , isGenerator = true)
public class Product {

    @Alias(value = "pro_id" , isGenerator = false)
    private int id;
    @Alias(value = "pro_name")
    private String name;

    private BigDecimal price;

    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 BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }
}

启动类Main方法:

package com.nf.lc.demo3;

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException {
        // 反射获得 class
        Class<?> clazz = Class.forName("com.nf.lc.demo3.Product");
       // 如果类 Product 上有注解 @Alias ,取出注解 value的值
        Alias declaredAnnotation = clazz.getDeclaredAnnotation(Alias.class);
        if(declaredAnnotation != null){
            System.out.println("类Product的注解@Alias的value值是:"+declaredAnnotation.value());
        }

        //获得所有该类方法,不包括从其他地方继承过来的
        Field[] declaredFields = clazz.getDeclaredFields();

        for (Field declaredField : declaredFields) {
            Alias fieldAnnotation = declaredField.getDeclaredAnnotation(Alias.class);
            if(fieldAnnotation != null){
                System.out.println("字段"+ declaredField.getName()
                        +"有注解,注解的value值是:"+fieldAnnotation.value()
                        +" 注解的isGenerator的值是:"+fieldAnnotation.isGenerator());
            } else {
                System.out.println("字段"+declaredField.getName()+"没有注解");
            }

        }

    }

}

运行结果:

归途(LC)

原文地址:https://www.cnblogs.com/ldl326308/p/10277137.html

时间: 2024-08-02 21:04:12

自定义注解,通过反射获得注解中的值(详细自定义注解解释)的相关文章

理解Android中的注解与反射

前言 最近一段时间在研究EventBus和Retrofit 的过程中,都遇到了注解这个概念.由于在学习Java的时候对这方面没有深入了解过,所以看起相关的代码来,总会有点不知其所以然,这里就注解和反射的使用做一下总结. 这里我们先从反射说起,了解了反射的意义及用法后,我们在看看注解的使用,最后叙述一下在Android开发中是怎样结合使用注解与反射. 反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法: 对于任何一个对象

为什么说Java中只有值传递----说服自己

在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好阅读本文. 错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递.如果是个引用,就是引用传递. 错误理解二:Java是引用传递. 错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递. 实参与形参 我们都知道,在Java中定义方法的时候是可以定义参数的.比如Java中的main方法: public static void main(String[] ar

[杂记]自定义注解以及反射的应用

序:对于注解的认知是从spring开始的,不管是aop还是ioc,对于其概念是比较清楚的,但真正的实现却没有一个比较好的认知,前段时间看了下<从零开始写web框架>,但当时看的比较仓促,再说因为时间的原因,并没有细揪很多东西,这两天研究了下公司一个系统的代码,突然间对于这块有了比较好的理解,故做潦草记录. 项目使用自定义注解和反射主要是为了在webSocket请求发过来的时候,通过请求中的参数定位到类和方法,然后去执行具体的业务逻辑,具体整个流程如下. 1.自定义注解 @Target(Elem

java自定义注解与反射

java注解与反射一.Java中提供了四种元注解,专门负责注解其他的注解,分别如下 1.@Retention元注解,表示需要在什么级别保存该注释信息(生命周期).可选的RetentionPoicy参数包括: RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认) RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注

Java高级之注解、反射

Java的注解.反射等机制的产生,让动态代理成为可能,一般通过全限定名+类名,找到类,可以invoke它的构造方法以及其他方法,可以获取它的参数(Field)名称和值. 注解一般用在代码的注释上.代码审查上(有没有按标准写,比如inspect).代码注入(hook,asbectj),需要考虑的是,在何时注入(编译期还运行期) 反射一般用在动态将json和Object互相转化,执行相关底层代码,比如设置某个类的Accessible为false,防止别人hook修改 例:阿里的FastJson解析:

注解与反射

一.注解(annotation) 1.注解定义 (1) 注解:也叫元数据,标签,注释,注解是给程序看的,而java注释是给程序员看的:它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来对这些元素进行说明,注释. ②JDK内置四大注解: @Override:验证子类是否覆写父类方法成功 @SuppressWarnings:抑制警告(抑制那条黄色的线) @Deprecated  申明 类或者方法...已经过期 @

日常学习整理--注解和反射

@interface 使用此注解可以进行自定义注解,类名即为注解名.自定义注解中只能定义方法,所有方法都是无参无修饰符的,返回值则是基本数据类型.String.Classs.Annotation.Enum或者对应的一位数组. 方法通过default设置默认值. 注解的使用 单方法注解可以直接进行注解名(值)的方法来使用 多方法的使用方式是注解名(方法名=值,方法名=值…) 当方法中存在默认值时可以不显示赋值. 格式 @Target(ElementType.METHOD) @Retention(R

注解与反射-复习

目录 注解 内置注解 元注解 自定义注解 反射机制 简介 Class类 Java内存 类加载的过程 ClassLoader 反射获取运行时类的结构信息 动态创建对象 通过反射创建对象 (一般情况) 通过"构造器对象"创建对象 (不存在无参构造) 通过反射调用成员: method field 测试: 性能分析 反射获取泛型数据 反射获取注解数据 基于B站秦疆老师的课. 感谢! 注解 @since JDK1.5 不是程序本身, 可以对程序做出解释, 可以被其他程序读取(如 编译器) 内置注

利用注解和反射将map转化成bean

一.java注解 java注解相关的类放在 java.lang.annotation 包下,其主要内容包含4个元注解和其中两个元注解的枚举类值,相对比较简单,从jdk问答即可了解 4个元注解: Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化.应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用.如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分. Inherited:指示注释类型被自动继