自定义annotation
程序员文章站
2022-05-13 11:15:20
...
对象有的属性在页面上可编辑,有的属性在页面只可读,以前都是我们在页面上写死的,时间一久有时候会混乱,此处通过自定义annotation在类属性中定义。越来越发现Java的Annotation真心很强大,可以帮我们省去很多代码,让代码看上去简洁。
下面这个例子 主要用到了
1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解
2.简单的反射
3.枚举
详细代码:
1.定义一个是可编辑还是可读的枚举类,可以用Boolean实现,但是枚举以后可以扩展到更多的值,枚举,如果不能像性别只有男、女这么确定,建议加一个“未知”,留作以后扩展
2.自定义一个annotation,属性为EditEnum,默认可编辑,因为可编辑的属性占多数
3.定义一个用户类,用Editable 来标识属性是否可编辑
4.通过反射获取各个Operator子属性的可编辑属性
Java的注解是个好东西,Java反射是个好东西。所以好东西需要保留。
下面这个例子 主要用到了
1.自定义annotation:@interface,以及几个配合着自定义注解使用的几个注解
2.简单的反射
3.枚举
详细代码:
1.定义一个是可编辑还是可读的枚举类,可以用Boolean实现,但是枚举以后可以扩展到更多的值,枚举,如果不能像性别只有男、女这么确定,建议加一个“未知”,留作以后扩展
package com.sha.annotation; public enum EditEnum { UNKNOW("未知",0), WRITE("可写",1), READ("可读",2); /** * 中文描述 */ private String desc; /** * 自定义序号 */ private int index; private EditEnum(String desc, int index) { this.desc = desc; this.index = index; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
2.自定义一个annotation,属性为EditEnum,默认可编辑,因为可编辑的属性占多数
package com.sha.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; @Inherited//允许子类继承父类的注解 @Documented//在生成javadoc文档的时候将该Annotation也写入到文档中。 @Target({ElementType.FIELD})//该自定义annotation只能用在子属性上 @Retention(RetentionPolicy.RUNTIME) //注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时,所以他们可以用反射的方式读取 public @interface Editable { /** * 默认可编辑 * @return */ public EditEnum value() default EditEnum.WRITE; }
3.定义一个用户类,用Editable 来标识属性是否可编辑
package com.sha.annotation; public class Operator{ /** * 用户ID,只可读 */ @Editable(value=EditEnum.READ) private int id; /** * 用户姓名,只可读 */ @Editable(value=EditEnum.READ) private String name; /** * 用户真实姓名,可编辑 */ @Editable private String trueName; /** * 用户密码可编辑 */ @Editable private String password; /** * 用户电话号码,可编辑 */ @Editable private String phone; 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 String getTrueName() { return trueName; } public void setTrueName(String trueName) { this.trueName = trueName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
4.通过反射获取各个Operator子属性的可编辑属性
package com.sha.annotation; import java.lang.reflect.Field; public class EditTest { public static void main(String[] args) { Operator op = new Operator(); Class<?> ed = op.getClass(); Field[] fields = ed.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if(fields[i].isAnnotationPresent(Editable.class)) { Editable flag = fields[i].getAnnotation(Editable.class); System.out.println(fields[i].getName()+"=="+flag.value().name()+"=="+flag.value().getIndex()+":"+flag.value().getDesc()); } } } }
Java的注解是个好东西,Java反射是个好东西。所以好东西需要保留。
上一篇: 【Linux】find命令的详解
下一篇: Linux学习笔记—补充内容