通过反射获取注解(Annotation)
2016-10-31 00:00
239 查看
以下实例,定义一个注解。通过反射获取。
主要功能:为所注解过的参数和方法附加一些信息可以获取。
定义注解。
主要功能:为所注解过的参数和方法附加一些信息可以获取。
定义注解。
import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到 @Target({ElementType.FIELD, ElementType.METHOD})//定义注解的作用目标**作用范围字段、枚举的常量/方法 @Documented//说明该注解将被包含在javadoc中 public @interface FieldMeta { /** * 是否为序列号 * * @return */ boolean id() default false; /** * 字段名称 * * @return */ String name() default ""; /** * 是否可编辑 * * @return */ boolean editable() default true; /** * 是否在列表中显示 * * @return */ boolean summary() default true; /** * 字段描述 * * @return */ String description() default ""; /** * 排序字段 * * @return */ int order() default 0; }
public class Anno { @FieldMeta(id = true, name = "序列号", order = 1) private int id; @FieldMeta(name = "姓名", order = 3) private String name; @FieldMeta(name = "年龄", order = 2) private int age; @FieldMeta(description = "描述", order = 4) public String desc() { return "java反射获取annotation的测试"; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }
import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Parent<T> { private Class<T> entity; public Parent() { init(); } @SuppressWarnings("unchecked") public List<SortableField> init() { List<SortableField> list = new ArrayList<SortableField>(); /**getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void) * 的直接超类的 Type(Class<T>泛型中的类型),然后将其转换ParameterizedType。。 * getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。 * [0]就是这个数组中第一个了。。 * 简而言之就是获得超类的泛型参数的实际类型。。*/ entity = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; // FieldMeta filed = entity.getAnnotation(FieldMeta.class); if (this.entity != null) { /**返回类中所有字段,包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段 * entity.getFields();只返回对象所表示的类或接口的所有可访问公共字段 * 在class中getDeclared**()方法返回的都是所有访问权限的字段、方法等; * 可看API * */ Field[] fields = entity.getDeclaredFields(); // for (Field f : fields) { //获取字段中包含fieldMeta的注解 FieldMeta meta = f.getAnnotation(FieldMeta.class); if (meta != null) { SortableField sf = new SortableField(meta, f); list.add(sf); } } //返回对象所表示的类或接口的所有可访问公共方法 Method[] methods = entity.getMethods(); for (Method m : methods) { FieldMeta meta = m.getAnnotation(FieldMe 7fe0 ta.class); if (meta != null) { SortableField sf = new SortableField(meta, m.getName(), m.getReturnType()); list.add(sf); } } //这种方法是新建FieldSortCom类实现Comparator接口,来重写compare方法实现排序 // Collections.sort(list, new FieldSortCom()); Collections.sort(list, new Comparator<SortableField>() { @Override public int compare(SortableField s1, SortableField s2) { return s1.getMeta().order() - s2.getMeta().order(); // return s1.getName().compareTo(s2.getName());//也可以用compare来比较 } }); } return list; } }
import java.lang.reflect.Field; public class SortableField { public SortableField() { } public SortableField(FieldMeta meta, Field field) { super(); this.meta = meta; this.field = field; this.name = field.getName(); this.type = field.getType(); } public SortableField(FieldMeta meta, String name, Class<?> type) { super(); this.meta = meta; this.name = name; this.type = type; } private FieldMeta meta; private Field field; private String name; private Class<?> type; public FieldMeta getMeta() { return meta; } public void setMeta(FieldMeta meta) { this.meta = meta; } public Field getField() { return field; } public void setField(Field field) { this.field = field; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Class<?> getType() { return type; } public void setType(Class<?> type) { this.type = type; } }
public class Anno { @FieldMeta(id = true, name = "序列号", order = 1) private int id; @FieldMeta(name = "姓名", order = 3) private String name; @FieldMeta(name = "年龄", order = 2) private int age; @FieldMeta(description = "描述", order = 4) public String desc() { return "java反射获取annotation的测试"; } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Child extends Parent<Anno> { }
import java.util.List; public class TestAnnotation { @SuppressWarnings({"unchecked", "rawtypes"}) public static void main(String[] args) { Parent c = new Child(); List<SortableField> list = c.init();//获取泛型中类里面的注解 //输出结果 for (SortableField l : list) { System.out.println("字段名称:" + l.getName() + "\t字段类型:" + l.getType() + "\t注解名称:" + l.getMeta().name() + "\t注解描述:" + l.getMeta().description()); } } }
相关文章推荐
- java 自定义注解annotation和通过反射获取注解
- java 通过反射获取注解
- 自己动手设计java web框架(二)-自定义注解以及通过反射获取注解
- Reflect 通过反射获取自定义注解值给另外一个对象赋值
- java通过反射获取类名、属性名称以及@Table注解上的表名称
- java通过Annotation对象获取注解属性的值
- 简单自定义Annotation和利用反射获取注解中的值
- java中自定义注解并通过反射获取注解属性值
- 通过反射获取字段,方法,注解
- java 注解annotation的使用,以及反射如何获取注解
- java注解,通过反射解析注解,模仿hibernate,获取sql语句。
- MyBatis+Spring在注解@Autowried后通过反射的方式调用方法获取注入的Service或DAO对象为空
- java 注解annotation的使用以及反射如何获取注解
- spring mvc框架源码分析(二)-自定义注解以及通过反射获取注解
- Reflect 通过反射获取自定义注解值给另外一个对象赋值
- java 注解annotation的使用,以及反射如何获取注解
- 黑马程序员自学笔记————通过反射来获取注解的信息;
- Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
- spring boot 中 自定义注解,并通过注解反射获取类实例
- android 自定义注解 通过反射获取注解属性值