精华内容
下载资源
问答
  • java 自定义注解

    2020-12-21 10:31:37
    @Target(value=ElementType.METHOD) //意味着注解只能用在方法前面@Retention(RetentionPolicy.RUNTIME) //注解在运行时有效,即可以被反射读取public @interface My {//注解内包含的是参数的信息,不是方法,比如...

    @Target(value=ElementType.METHOD) //意味着注解只能用在方法前面

    @Retention(RetentionPolicy.RUNTIME) //注解在运行时有效,即可以被反射读取

    public @interface My {

    //注解内包含的是参数的信息,不是方法,比如定义了一个String类型的name变量

    String name() default ""; //加默认值,通常为0或空字符串,默认值为-1表示不存在

    int age() default 0;

    int id() default -1;

    //定义一个数组

    String[] s() default {"me","you"};

    }

    value值可以定义为一个数组,以下表示可以在方法和类前使用注解

    @Target(value= {ElementType.METHOD,ElementType.TYPE})

    public @interface my2{

    }

    如果注解里只有一个参数,通常定义为value

    @Target(value= {ElementType.METHOD,ElementType.TYPE})

    @Retention(RetentionPolicy.RUNTIME)

    public @interface My2 {

    //如果注解里只有一个参数,通常定义为value

    String value() default "";

    }

    main

    public class Demo {

    @My(age=19,name="me",id=10,s= {"it","that"}) //显示指定相应的值,可通过反射读取

    public void test()

    {

    }

    //注解只有一个参数时

    @My2(value="aaa")//或者 @My2("ada")

    public void test2()

    {

    }

    public static void main(String[] args) {

    }

    }

    展开全文
  • Java自定义注解

    2020-12-21 10:31:38
    那么我们怎么去实现自个的注解,也就是自定义注解呢?一、自定义一个注解(MyValidate),使用元注解定义各项用途image.png二、定义该注解的业务逻辑,这里只实现了注解的一个属性:isNotNull()image.png然后就就可以...

    什么是注解?

    注解就是为容器提供元数据,例如@Controller 注解则是标记了该Bean需要交给Spring容器进行管理。

    那么我们怎么去实现自个的注解,也就是自定义注解呢?

    一、自定义一个注解(MyValidate),使用元注解定义各项用途

    image.png

    二、定义该注解的业务逻辑,这里只实现了注解的一个属性:isNotNull()

    image.png

    然后就就可以愉快的使用了

    image.png

    实际项目中通过拦截器或者切面来实现:

    1、定义一个interface,命名为BaseCheck,BaseCheck里面有一个抽象的check方法,check方法返回值是boolean。

    2、定义校验的注解,比如:@NotNull、@Length。

    3、根据上面的注解,分别定义对应的校验类,比如:NotNullCheck、LengthCheck。

    4、NotNullCheck、LengthCheck都需要实现BaseCheck的check方法,你要在check方法里面写校验流程。

    5、定义一个容器,在工程启动的时候,把NotNullCheck和LengthCheck的对象塞到里面,

    如果你使用spring,直接在NotNullCheck和LengthCheck上面加个注解@Component,也能达到同样的效果。

    6、定义一个拦截器或者切面。

    7、在这个拦截器或者切面里,拿到请求的参数,也就是那个user对象。

    8、通过反射,获取到这个user对象所对应的类,类的名字肯定就是User了。

    9、遍历User里面的所有Field,检查每一个Field是否含有注解。

    10、遍历Field上的所有注解。

    11、假设找到一个注解@NotNull,就去找一下对应的校验类,

    BaseCheck baseCheck = 容器.get("NotNullCheck")

    或者BaseCheck baseCheck = (BaseCheck) SpringUtl.getBean("NotNullCheck")

    12、如果找到,也就是baseCheck不为空,则通过反射获取这个Field的实际值,将这个值作为参数,调用baseCheck.check方法

    13、baseCheck.check如果返回false则报错,如果返回true则继续,直到遍历完所有Field、所有注解

    展开全文
  • 首先定义自定义注解 ParamsRequired/*** 请求参数校验** @author lishon* @create 2017-10-26 10:38**/@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface ParamsRequired {/*** 必须...

    首先定义自定义注解 ParamsRequired

    /**

    * 请求参数校验

    *

    * @author lishon

    * @create 2017-10-26 10:38

    **/

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface ParamsRequired {

    /**

    * 必须参数

    * @return

    */

    boolean requrie() default true;

    }

    然后再basepojo 中实现valide 判断是否标记ParamsRequired 注解,如果标记 则判断标记的是否需要判断为空

    public class BasePojo {

    public boolean validate() throws Exception {

    Field[] fields = this.getClass().getDeclaredFields();

    for (Field field : fields) {

    if(field.isAnnotationPresent(ParamsRequired.class)) {

    ParamsRequired paramsRequired = field.getAnnotation(ParamsRequired.class);

    if(paramsRequired.requrie()) {

    // 如果类型是String

    if (field.getGenericType().toString().equals(

    "class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名

    // 拿到该属性的gettet方法

    /**

    * 这里需要说明一下:他是根据拼凑的字符来找你写的getter方法的

    * 在Boolean值的时候是isXXX(默认使用ide生成getter的都是isXXX)

    * 如果出现NoSuchMethod异常 就说明它找不到那个gettet方法 需要做个规范

    */

    Method m = this.getClass().getMethod(

    "get" + getMethodName(field.getName()));

    String val = (String) m.invoke(this);// 调用getter方法获取属性值

    if(StringUtils.isEmpty(val)) {

    throw new ParamsNullException(field.getName() + " 不能为空!");

    } else if (val != null) {

    System.out.println("String type:" + val);

    }

    } else if (field.getGenericType().toString().equals(

    "class java.lang.Integer")) { // 如果type是类类型,则前面包含"class ",后面跟类名

    Method m = this.getClass().getMethod(

    "get" + getMethodName(field.getName()));

    Integer val = (Integer) m.invoke(this);// 调用getter方法获取属性值

    if (val != null) {

    System.out.println("String type:" + val);

    }

    }

    }

    }

    }

    return true;

    }

    /**

    * 把一个字符串的第一个字母大写、效率是最高的、

    */

    private String getMethodName(String fildeName) throws Exception{

    byte[] items = fildeName.getBytes();

    items[0] = (byte) ((char) items[0] - 'a' + 'A');

    return new String(items);

    }

    }

    最后 在 pojo 对象上需要检验的参数上加上 paramsRequired 注解

    public class TranReq extends BasePojo{

    /**

    *交易设备终端号

    */

    @ParamsRequired

    private String tid;

    /**

    *企业编码

    */

    @ParamsRequired

    private String companyCode;

    /**

    *交易类型

    */

    private String transType;

    }

    最后调用 valide

    public static void main(String[] args){

    TranReq req = new TranReq();

    try {

    req.validate();

    } catch (Exception e) {

    if(e instanceof ParamsNullException) {

    System.out.println(e.getMessage());

    } else {

    e.printStackTrace();

    }

    }

    }

    输出结果:

    tid 不能为空!

    进程已结束,退出代码0

    麻麻再也不用担心代码中 出现大量if else 了,

    展开全文
  • java自定义注解学习

    2020-12-21 10:31:27
    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java我们提供的元注解和相关定义注解的语法。元注解:元注解的作用就是负责注解其他注解。Java5.0定义了4个标准...

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法。

    元注解:

    元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:

    1.@Target,

    2.@Retention,

    3.@Documented,

    4.@Inherited

    这些类型和它们所支持的类在java.lang.annotation包中可以找到。下面我们看一下每个元注解的作用和相应分参数的使用说明。

    @Target:

    @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。

    作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

    取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器

    2.FIELD:用于描述域

    3.LOCAL_VARIABLE:用于描述局部变量

    4.METHOD:用于描述方法

    5.PACKAGE:用于描述包

    6.PARAMETER:用于描述参数

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

    使用实例:

    @Target(ElementType.TYPE)

    public @interface Table {

    /**

    * 数据表名称注解,默认值为类名称

    * @return

    */

    public String tableName() default "className";

    }

    @Target(ElementType.FIELD)

    public @interface NoDBColumn {

    }

    注解Table 可以用于注解类、接口(包括注解类型) 或enum声明,而注解NoDBColumn仅可用于注解类的成员变量。

    @Retention:

    @Retention定义了该Annotation被保留的时间长短:某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对 Annotation的“生命周期”限制。

    作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)

    取值(RetentionPoicy)有:

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

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

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

    Retention meta-annotation类型有唯一的value作为成员,它的取值来自java.lang.annotation.RetentionPolicy的枚举类型值。具体实例如下:

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    public @interface Column {

    public String name() default "fieldName";

    public String setFuncName() default "setField";

    public String getFuncName() default "getField";

    public boolean defaultDBValue() default false;

    }

    Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

    @Documented:

    @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    public @interface Column {

    public String name() default "fieldName";

    public String setFuncName() default "setField";

    public String getFuncName() default "getField";

    public boolean defaultDBValue() default false;

    }

    @Inherited:

    @Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

    注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

    当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则反射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。

    实例代码:

    /**

    *

    * @author peida

    *

    */

    @Inherited

    public @interface Greeting {

    public enum FontColor{ BULE,RED,GREEN};

    String name();

    FontColor fontColor() default FontColor.GREEN;

    }

    自定义注解:

    使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

    定义注解格式:

    public @interface 注解名 {定义体}

    注解参数的可支持数据类型:

    1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)

    2.String类型

    3.Class类型

    4.enum类型

    5.Annotation类型

    6.以上所有类型的数组

    Annotation类型里面的参数该怎么设定:

    第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型;

    第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和 String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String;

    第三,如果只有一个参数成员,最好把参数名称设为"value",后加小括号.例:下面的例子FruitName注解就只有一个参数成员。

    简单的自定义注解和使用注解实例:

    package annotation;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    /**

    * 水果名称注解

    * @author peida

    *

    */

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    public @interface FruitName {

    String value() default "";

    }

    package annotation;

    import java.lang.annotation.Documented;

    import java.lang.annotation.ElementType;

    import java.lang.annotation.Retention;

    import java.lang.annotation.RetentionPolicy;

    import java.lang.annotation.Target;

    /**

    * 水果颜色注解

    * @author peida

    *

    */

    @Target(ElementType.FIELD)

    @Retention(RetentionPolicy.RUNTIME)

    @Documented

    public @interface FruitColor {

    /**

    * 颜色枚举

    * @author peida

    *

    */

    public enum Color{ BULE,RED,GREEN};

    /**

    * 颜色属性

    * @return

    */

    Color fruitColor() default Color.GREEN;

    }

    package annotation;

    import annotation.FruitColor.Color;

    public class Apple {

    @FruitName("Apple")

    private String appleName;

    @FruitColor(fruitColor=Color.RED)

    private String appleColor;

    public void setAppleColor(String appleColor) {

    this.appleColor = appleColor;

    }

    public String getAppleColor() {

    return appleColor;

    }

    public void setAppleName(String appleName) {

    this.appleName = appleName;

    }

    public String getAppleName() {

    return appleName;

    }

    public void displayName(){

    System.out.println("水果的名字是:苹果");

    }

    }

    注解元素的默认值:

    注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。例如:

    1 package annotation;

    2

    3 import java.lang.annotation.Documented;

    4 import java.lang.annotation.ElementType;

    5 import java.lang.annotation.Retention;

    6 import java.lang.annotation.RetentionPolicy;

    7 import java.lang.annotation.Target;

    8

    9 /**

    10 * 水果供应者注解

    11 * @author peida

    12 *

    13 */

    14 @Target(ElementType.FIELD)

    15 @Retention(RetentionPolicy.RUNTIME)

    16 @Documented

    17 public @interface FruitProvider {

    18 /**

    19 * 供应商编号

    20 * @return

    21 */

    22 public int id() default -1;

    23

    24 /**

    25 * 供应商名称

    26 * @return

    27 */

    28 public String name() default "";

    29

    30 /**

    31 * 供应商地址

    32 * @return

    33 */

    34 public String address() default "";

    35 }

    定义了注解,并在需要的时候给相关类,类属性加上注解信息,如果没有响应的注解信息处理流程,注解可以说是没有实用价值。如何让注解真真的发挥作用,主要就在于注解处理方法,下一步我们将学习注解信息的获取和处理!

    展开全文
  • Java自定义注解程序Demo
  • 自定义注解 参数判(注解+AOP)

    千次阅读 热门讨论 2021-01-06 14:24:07
    自定义注解 参数判(注解+AOP) (AOP相关依赖需要在pom文件中自行导入) 一、创建自定义注解 CheckNull 1、新建 @interface 文件 checkNull (可以先创建.java文件后讲class文件改成@interface即可) 2、关于@...
  • JAVA自定义注解判断属性是否为空

    千次阅读 2020-07-21 18:29:05
    一、自定义注解 Java @Target(value=ElementType.FIELD) @Retention(value = RetentionPolicy.RUNTIME) public @interface NotNull { String message() default ""; } Target,Retention是元注解,也就是注解...
  • spring中自定义注解(annotation)与AOP中获取注解.通过实例演示自定义注解
  • ![图片说明]... field.getAnnotations()能取到,而field.getAnnotation(Required.class)却不能取到 不知道什么会出现这种现象,哪位大神可以帮忙分析一下吗
  • 初学spring的时候使用注解总觉得使用注解很神奇,加一个注解就能实现想要的功能,很好奇,也想自己根据需要写一些自己实现的自定义注解。问题来了,自定义注解到底是什么?肯定会有人和我一样有这个疑惑,我根据自己...
  • 标签: java 自定义注解 背景 自定义注解实现字段有条件的判,例如Student有三个字段name、age、sex;name、age不能为空,sex只有当age=18时不能为空(可能例子不是很符合实际场景,只实现说明) ...
  • java自定义注解,元注解的使用 ,元注解中值详解元注解:用于注解注解的注解...元注解共有4个:①、@target:用于明确注解用于目标类的哪个位置elementtype枚举类的值:type:用于注解类fields:用于注解属性methods:...
  • 1.首先先定义一个注解,源码如下: 2.利用反射获取到注解,方法,变量等,进行值的校验,源码如下: 3.如何使用:在变量加上此注解即可:
  • java_自定义注解

    2021-03-16 21:44:38
    1注解的定义和用途1.1官方描述An annotation is a form of metadata, that can be added to Java source code.Classes, methods, variables, parameters and packages may be annotated.Annotations have no direct ...
  • 深入JAVA注解(Annotation):自定义注解

    万次阅读 多人点赞 2019-07-31 18:40:53
    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java我们提供的元注解和相关定义注解的语法。 元注解:  元注解的作用就是负责注解其他注解。Java5.0定义了4...
  • 通过自定义注解,满足不为空才进行正则校验的需求 import javax.validation.Constraint; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax....
  • 步骤1、创建自定义注解类,并添加校验规则2、解析自定义注解类并实现校验方法3、创建测试类并声明自定义注解4、编写Junit测试类测试结果自定义注解类package com.swk.common.annotation;import java.lang.annotation...
  • 下面来实战演示一下如何使用自定义注解做一些实际的功能。比如校验对象属性是否为空。 一、自定义一个NotNull注解 我们自定义一个NotNull注解,里面有一个参数message 默认“”; /** * 自定义注解 * 判断屬性不...
  • 自定义注解实现方式解析

    千次阅读 2021-10-19 16:59:49
    ​自定义注意在日常开发中经常使用,同时有很多实现自定义注解的方式,本文将带你一一了解。 1.源注解解析 @Retention //注解只会存在源代码中,将会被编译器丢弃 SOURCE, //注解将会保留到class文件阶段,但是在...
  • Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容缩减版,具体...
  • 插件地址https://gitee.com/lsc-git/lsc.git 主要利用 aop 和 反射 实现
  • public class Person { String name; int age; @MyTiger public Person(String name,int age){ this.name = name; this.age = age; } @MyTiger @Override public String toString(){ ...```
  • Java使用自定义注解并处理注解

    千次阅读 2021-04-19 14:48:22
    目录元注解自定义注解使用注解处理注解的方法测试使用 元注解 负责注解其他注解, Java定义了4个标准的meta-annotation类型, 他们被用来对其他annotation类型作说明 在 java.lang.annotation中可以找到 @Target: ...
  • Java自定义注解(使用篇)

    千次阅读 2021-03-13 06:23:44
    自定义注解自定义注解分为两个部分:注解声明和注解处理逻辑。每个注解可以有多个属性值,同名注解通过声明后可以在对象上使用多个。注解结构定义注解用以下实例说明:12345678910@Repeatable(Lea...
  • Java自定义注解Annotation详解

    万次阅读 多人点赞 2017-12-17 17:57:17
    简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解 @Override:当重写父类的方法时一般都会在方法上标注上此注解...
  • springboot 加了自定义注解,注入的servicesnull 解决方法: Controller层的RequestMapping方法不能设置private(私有的),这样会导致在动态代理过程中无法注入private对象。这里跟用@Autowire和@Resouce没有关系。...
  • java自定义注解

    2020-06-04 11:20:25
    * 自定义注解 * 使用在属性上 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface AttributeDesc { String notes() default "";//属性名称 boolean can
  • 前言最近为了工作也为了更加深入了解掌握java注解的使用,决定自定义注解来实现数据验证。API开发中经常会遇到一些对请求数据进行验证的情况,这时候如果使用注解就有两个好处,一是验证逻辑和业务逻辑分离,代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 68,029
精华内容 27,211
关键字:

自定义注解可为空