专业的JAVA编程教程与资源

网站首页 > java教程 正文

JAVA自定义注解之interface(java entity注解)

temp10 2024-09-27 23:02:15 java教程 7 ℃ 0 评论

前言:

一、注解的介绍

JAVA自定义注解之interface(java entity注解)

1.自定义注解的定义:Java文件叫做Annotation,用@interface表示。

2.元注解:@interface上面按需要注解上一些东西,包括@Retention、@Target、@Document、@Inherited四种。

3.注解的保留策略:

@Retention(RetentionPolicy.SOURCE) // 注解仅存在于源码中,在class字节码文件中不包含

@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得

@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到

4.注解作用于目标:

@Target(ElementType.TYPE) // 接口、类、枚举、注解

@Target(ElementType.FIELD) // 字段、枚举的常量

@Target(ElementType.METHOD) // 方法

@Target(ElementType.PARAMETER) // 方法参数

@Target(ElementType.CONSTRUCTOR) // 构造函数

@Target(ElementType.LOCAL_VARIABLE) // 局部变量

@Target(ElementType.ANNOTATION_TYPE) // 注解

@Target(ElementType.PACKAGE) // 包

5.注解包含在javadoc中:

@Documented

6.注解可以被继承:

@Inherited

7.注解解析器:用来解析自定义注解。


正文:

一、注解的使用

第一步:新建注解MyFirstAnn.class

 import java.lang.annotation.*;

/**
 * @package: com.beijingdesigner.hydra.test.sc
 * @description: Init
 * @author: IT讲坛
 * @create: 2018-11-20 14:22
 **/
@Documented
@Inherited
@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyFirstAnn
{
 String value() default "";
}

第二步新建实体类UserDemo.class

package com.beijingdesigner.hydra.test.sc;

import lombok.Data;

/**
 * @package: com.beijingdesigner.hydra.test.sc
 * @description: user
 * @author: IT讲坛
 * @create: 2018-11-20 14:24
 **/
@Data
public class UserDemo {
 @MyFirstAnn(value = "Rose")
 private String name;
 @MyFirstAnn(value = "女")
 private String sex;
}

第三步新建工厂类UserTestFactory.class

package com.beijingdesigner.hydra.test.sc;

import com.alibaba.fastjson.JSON;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @package: com.beijingdesigner.hydra.test.sc
 * @description: 工厂类
 * @author: BeijingdesignerCapital--shanchangqing
 * @create: 2018-11-20 14:26
 **/
public class UserTestFactory {
 public static UserDemo create()
 {
 UserDemo user = new UserDemo();

 // 获取User类中所有的方法(getDeclaredMethods也行)
 Method[] methods = UserDemo.class.getMethods();
 Field[] declaredFields = UserDemo.class.getDeclaredFields();

 try
 {
 System.out.println("利用field反射赋值");
 for (Field f:declaredFields) {
 if (f.isAnnotationPresent(MyFirstAnn.class)){
 MyFirstAnn annotation = f.getAnnotation(MyFirstAnn.class);
 Method method= user.getClass().getMethod("set"+f.getName().substring(0,1).toUpperCase().concat(f.getName().substring(1)),String.class);
 method.invoke(user,annotation.value());
 }
 }
// System.out.println("利用method反射赋值");
// for (Method method : methods)
// {
// // 如果此方法有注解,就把注解里面的数据赋值到user对象
// if (method.isAnnotationPresent(MyFirstAnn.class))
// {
// MyFirstAnn init = method.getAnnotation(MyFirstAnn.class);
// method.invoke(user, init.value());
// }
// }
 }
 catch (Exception e)
 {
 e.printStackTrace();
 return null;
 }

 return user;
 }
}

第四步新建测试类TestUser.class

package com.beijingdesigner.hydra.test.sc;

import com.alibaba.fastjson.JSON;

/**
 * @package: com.beijingdesigner.hydra.test.sc
 * @description: 测试注解
 * @author: IT讲坛
 * @create: 2018-11-20 14:27
 **/
public class TestUser {
 public static void main(String []args){
 UserDemo user = UserTestFactory.create();
 System.out.println(JSON.toJSONString(user));
 }
}

如果想用method方法反射赋值

需要简单修改下实体类为

package com.beijingdesigner.hydra.test.sc;

import lombok.Data;

/**
 * @package: com.beijingdesigner.hydra.test.sc
 * @description: user
 * @author: IT讲坛
 * @create: 2018-11-20 14:24
 **/
@Data
public class UserDemo {

 private String name;

 private String sex;

 public String getName() {
 return name;
 }
 @MyFirstAnn(value = "Rose")
 public void setName(String name) {
 this.name = name;
 }

 public String getSex() {
 return sex;
 }
 @MyFirstAnn(value = "女")
 public void setSex(String sex) {
 this.sex = sex;
 }
}

这样放开工厂类上面的注释,测试即可;


自定义注解的应用远不止于此:

比如你在mvc项目中加了过滤器,但是有些方法(你可以通过加自定义注解)需要跳过过滤器。

当然了,你可以在过滤器配置中指定某些包下的方法跳过过滤,这种方式有点陈旧了,不在本次考虑范围内。

1.新建方法注解

package com.beijingdesigner.hydra.test.sc;

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

/**
 * @desciption :注解用于跳过过滤器校验
 * @author: IT讲坛
 * @date:2018-11-20
 * @time:15:20
 */

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

}

2.在controller层添加注解

3.在拦截器里面校验:

4.用postman发起请求测试

5.输出结果:


自定义注解的使用还有很多很多,这里不过多讲解了,有兴趣的同学可以深入研究下,对自己技术的提升肯定是有帮助的。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表