如何使用自定义注解?

基于注解实现VO的属性值或者用于权限问题

Posted by MasterJen on November 10, 2018

Hey Annotation

Life isn’t about waiting for the storm to pass. it’s about learning to dance in the rain –人生不是坐等暴风雨过去,而是学会在雨中起舞。

今天做项目时,有个需求是实现权限的问题,思索了许久,最终想到了通过自定义注解的方式实现此功能,经过不断地修改,结果还是美好的。接下类就给大家介绍一下自定义注解的简单使用吧。

java中对于注解的解释是:注解(Annotation)相当于一种标记,在程序中加入注解就等于为程序打上某种标记,没有加,则等于没有任何标记,以后,javac编译器、开发工具和其他程序可以通过反射来了解你的类及各种元素上有无何种标记,看你的程序有什么标记,就去干相应的事,标记可以加在包、类,属性、方法,方法的参数以及局部变量上。那么怎么使用自定义注解呢?

首先声明一个注解 ShowVOAnno (此注解的作用是,放在类中的属性上,当数据库查询出来结果时,显示到页面的内容属性只是带有此注解的属性)

//目标 资源,作用域是属性上 
@Target(value = {ElementType.FIELD})
//运行时 执行,不写的话,找不到该注解
@Retention(RetentionPolicy.RUNTIME)
public @interface ShowVOAnno {
//   默认值是 ""
    String value() default "";
}

然后目标类的属性上加上注解 User (当此类在数据库中查询到时,显示到页面上的内容的属性只有带注解的 属性)

public class User {
//    用户id
    private Integer user_id;
//    用户真实姓名
    @ShowVOAnno
    private String user_name;
//    手机号
    @Pattern(regexp="^[1][3,4,5,8][0-9]{9}$",message="手机号格式不对")
    @ShowVOAnno
    private String user_mobile;
//    昵称
    @ShowVOAnno
    private String user_nickname;
//    身份证信息
    @ShowVOAnno
    @Size(min = 18,max = 18,message = "身份格式不对")
    private  String user_identify;
    //    交易密码
    @Size(min = 6,max = 6,message = "密码长度不对")
    private String user_password;
}

进行处理此注解的工具类 ShowObjectFileVoUtils

/**
 *
 *  显示在页面中的类的属性的值  比如 显示用户名 就在用户名上加个注解  ShowVOAnno
 * */
public class ShowObjectFiledVOUtils {
//    进行处理类的显示属性
    public static Map<String,String> showObjectByShowAnno(Object object){
//        key 是属性  value 是值
        Map<String,String> map = new HashMap<>();
//        得到类
        Class<?> aClass = object.getClass();
//        根据类 得到属性
        Field[] fields = aClass.getDeclaredFields();
//        遍历属性  看是否上面存在 注解
        for (Field field : fields) {
//            进行判断
            ShowVOAnno annotation = field.getAnnotation(ShowVOAnno.class);
            if(annotation!=null){
//                说明存在此 注解  可以显示  根据 属性 得到值
                try {
                    PropertyDescriptor propertyDescriptor = new PropertyDescriptor(field.getName(),aClass);
//                    得到读取属性的值的方法
                    Method readMethod = propertyDescriptor.getReadMethod();
//                    判断此get 方法
                    if(readMethod!=null){
                        String invoke = (String)readMethod.invoke(object);
//                    放到map中
                        map.put(field.getName(),invoke);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return map;
    }
}

测试类 Test

 @Test
//    public void test01(){
//        测试封装类
//        User user = new User();
//        user.setUser_mobile("123123");
//        user.setUser_identify("1234565678");
//        user.setUser_img("123123");
//        user.setUser_password("5678");
//        user.setUser_name("26354862348723");
//        Map<String, String> map = ShowObjectFiledVOUtils.showObjectByShowAnno(user);
//        for (Map.Entry<String, String> entry : map.entrySet()) {
//            System.out.println(entry.getKey()+"------->"+entry.getValue()+"=====");
//        }
//    }

输出结果

user_mobile------->123123=====
user_name------->26354862348723=====
user_nickname------->null=====
user_identify------->1234565678=====
user_img------->123123=====

如此便完成了自定义注解,并且对自定义注解进行了使用,在以后的项目中,使用自定义注解的场景还是挺多的,比如,对某个路径进行设置权限,完全可以通过自定义注解进行实现,只不过,就是权限的注解的作用域不在于属性,而是方法和类上罢了.如果还有疑问,可以在评论下方留言哦,蟹蟹。