java自定义注解为空值_java 自定义注解

本文详细介绍了如何在Java中自定义注解,用于字段的默认值赋值和数据校验。通过创建注解、在数据模型上应用、编写注解解析器,展示了如何在运行时动态地处理注解信息,实现对象初始化和验证功能。
摘要由CSDN通过智能技术生成

转载自(https://www.cnblogs.com/liangweiping/p/3837332.html)

目录

1.通过自定义注解,进行赋值

2.通过自定义注解,进行校验

3.实际应用如何应用自定义注解

4.其他注意事项

-----------------------------

1.通过自定义注解,进行赋值

1.自定义注解

package annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Init.java

*

* @author IT唐伯虎 2014年7月10日

*/

@Documented

@Inherited

@Target({ ElementType.FIELD, ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

public @interface Init

{

public String value() default "";

}

2.在数据模型使用注解

package model;

import annotation.Init;

/**

* User.java

*

* @author IT唐伯虎 2014年7月10日

*/

public class User

{

private String name;

private String age;

public String getName()

{

return name;

}

@Init(value = "liang")

public void setName(String name)

{

this.name = name;

}

public String getAge()

{

return age;

}

@Init(value = "23")

public void setAge(String age)

{

this.age = age;

}

}

3.用“构造工厂”充当“注解解析器”

package factory;

import java.lang.reflect.Method;

import annotation.Init;

import model.User;

/**

* UserFactory.java

*

* @author IT唐伯虎 2014年7月10日

*/

public class UserFactory

{

public static User create()

{

User user = new User();

// 获取User类中所有的方法(getDeclaredMethods也行)

Method[] methods = User.class.getMethods();

try

{

for (Method method : methods)

{

// 如果此方法有注解,就把注解里面的数据赋值到user对象

if (method.isAnnotationPresent(Init.class))

{

Init init = method.getAnnotation(Init.class);

method.invoke(user, init.value());

}

}

}

catch (Exception e)

{

e.printStackTrace();

return null;

}

return user;

}

}

4.运行的代码

package app;

import java.lang.reflect.InvocationTargetException;

import factory.UserFactory;

import model.User;

/**

* Test.java

*

* @author IT唐伯虎 2014年7月10日

*/

public class Test

{

public static void main(String[] args) throws IllegalAccessException,

IllegalArgumentException, InvocationTargetException

{

User user = UserFactory.create();

System.out.println(user.getName());

System.out.println(user.getAge());

}

}

5.运行结果

liang

23

2.通过自定义注解,进行校验

1.自定义注解

package annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* Validate.java

*

* @author IT唐伯虎 2014年7月11日

*/

@Documented

@Inherited

@Target({ ElementType.FIELD, ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

public @interface Validate

{

public int min() default 1;

public int max() default 10;

public boolean isNotNull() default true;

}

2.在数据模型使用注解

package model;

import annotation.Validate;

/**

* User.java

*

* @author IT唐伯虎 2014年7月11日

*/

public class User

{

@Validate(min = 2, max = 5)

private String name;

@Validate(isNotNull = false)

private String age;

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public String getAge()

{

return age;

}

public void setAge(String age)

{

this.age = age;

}

}

3.注解解析器

package check;

import java.lang.reflect.Field;

import annotation.Validate;

import model.User;

/**

* UserCheck.java

*

* @author IT唐伯虎 2014年7月11日

*/

public class UserCheck

{

public static boolean check(User user)

{

if (user == null)

{

System.out.println("!!校验对象为空!!");

return false;

}

// 获取User类的所有属性(如果使用getFields,就无法获取到private的属性)

Field[] fields = User.class.getDeclaredFields();

for (Field field : fields)

{

// 如果属性有注解,就进行校验

if (field.isAnnotationPresent(Validate.class))

{

Validate validate = field.getAnnotation(Validate.class);

if (field.getName().equals("age"))

{

if (user.getAge() == null)

{

if (validate.isNotNull())

{

System.out.println("!!年龄可空校验不通过:不可为空!!");

return false;

}

else

{

System.out.println("年龄可空校验通过:可以为空");

continue;

}

}

else

{

System.out.println("年龄可空校验通过");

}

if (user.getAge().length() < validate.min())

{

System.out.println("!!年龄最小长度校验不通过!!");

return false;

}

else

{

System.out.println("年龄最小长度校验通过");

}

if (user.getAge().length() > validate.max())

{

System.out.println("!!年龄最大长度校验不通过!!");

return false;

}

else

{

System.out.println("年龄最大长度校验通过");

}

}

if (field.getName().equals("name"))

{

if (user.getName() == null)

{

if (validate.isNotNull())

{

System.out.println("!!名字可空校验不通过:不可为空!!");

return false;

}

else

{

System.out.println("名字可空校验通过:可以为空");

continue;

}

}

else

{

System.out.println("名字可空校验通过");

}

if (user.getName().length() < validate.min())

{

System.out.println("!!名字最小长度校验不通过!!");

return false;

}

else

{

System.out.println("名字最小长度校验通过");

}

if (user.getName().length() > validate.max())

{

System.out.println("!!名字最大长度校验不通过!!");

return false;

}

else

{

System.out.println("名字最大长度校验通过");

}

}

}

}

return true;

}

}

4.运行的代码

package app;

import check.UserCheck;

import model.User;

/**

* Test.java

*

* @author IT唐伯虎 2014年7月11日

*/

public class Test

{

public static void main(String[] args)

{

User user = new User();

user.setName("liang");

user.setAge("1");

System.out.println(UserCheck.check(user));

}

}

5.运行结果

名字可空校验通过

名字最小长度校验通过

名字最大长度校验通过

年龄可空校验通过

年龄最小长度校验通过

年龄最大长度校验通过

true

3.实际应用如何应用自定义注解

Q: 实际我们用的时候,比如校验,加上注解之后,我们给user对象set值,会自动校验,不会主动调用check方法,这部分是怎么个实现原理,楼主能否补充一下,谢谢?

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

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、所有注解

4.其他注意事项

1-如下定义,是spring中定义@Service注解,

意味着@Service 继承了 @Component注解的所有功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值