java反射获取注解id,通过反射获取注解(Annotation)
以下实例,定义一个注解。通过反射获取。
主要功能:为所注解过的参数和方法附加一些信息可以获取。
定义注解。
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 {
private Class entity;
public Parent() {
init();
}
@SuppressWarnings("unchecked")
public List init() {
List list = new ArrayList();
/**getClass().getGenericSuperclass()返回表示此 Class 所表示的实体(类、接口、基本类型或 void)
* 的直接超类的 Type(Class泛型中的类型),然后将其转换ParameterizedType。。
* getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。
* [0]就是这个数组中第一个了。。
* 简而言之就是获得超类的泛型参数的实际类型。。*/
entity = (Class) ((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(FieldMeta.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() {
@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 {
}
import java.util.List;
public class TestAnnotation {
@SuppressWarnings({"unchecked", "rawtypes"})
public static void main(String[] args) {
Parent c = new Child();
List list = c.init();//获取泛型中类里面的注解
//输出结果
for (SortableField l : list) {
System.out.println("字段名称:" + l.getName() + "\t字段类型:" + l.getType() +
"\t注解名称:" + l.getMeta().name() + "\t注解描述:" + l.getMeta().description());
}
}
}
java反射获取注解id,通过反射获取注解(Annotation)相关推荐
- Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)
1. 概述 os 包提供了操作系统函数的不依赖平台的接口.失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.例如,如果某个使用一个文件名的调用(如Open.Stat)失败了,打印错误时会包含 ...
- android浏览器获取设备id,H5能获取到手机设备ID或者手机浏览器唯一识别码吗
content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> JS获取手机型 ...
- android 指定资源id,Android 通过名称获取资源ID
当我们获取网络数据的时候,解析之后往往都是一个字符串,而不是资源id,所有我们没有办法直接使用,只能通过名称来获取到资源id, package com.example.administrator.de ...
- java注解,通过反射解析注解,模仿hibernate,获取sql语句。
常用注解: 自定义注解,标准格式: 1,target:注解作用域 2,Retention:声明周期 运行子类继承,但是子类继承只能作用到类注解,字段注解,是继承不了的. 使用注解:通过下面这种方式,为 ...
- Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件
首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import jav ...
- java 反射 参数名_JAVA 8 反射获取参数名
前言 在JDK8之前javac编译是不会把构造器和方法的参数名编译进class中,如果需要获取参数名,可以在方法上加上注解,反射获取注解的值从而获取参数名,比如Jackson的@JsonCreator ...
- java 反射 找不到方法_Java获取反射的三种方法
class Student { private int id; String name; protected boolean sex ; pub1ic f1oat score; } pub1ic cl ...
- java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作
我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得 ...
- Java反射机制demo(四)—获取一个类的父类和实现的接口
2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...
最新文章
- [转]C#日期格式化 文档
- 方案 mysql 优点_mysql高可用方案分析
- 3.依赖注入 spring_di
- 【mongoDB】 备份
- 学习threeJS(一)--第一个threeJs
- HBase键值分片的简单运用
- 1106: 回文数(函数专题)
- 离散点自动生成等高线_有限自动机| 离散数学
- DHCP服务器异常,上不了网解决办法
- Linux连接mysql 出现Access denied for user ‘root‘@‘localhost‘(using password: YES)错误解决方案
- FastHook——实现.dynsym段和.symtab段符号查询
- 163网站顶部展出的大幅广告
- 歇后语:有牌不胡偏要杠
- 解决PCL 编译报错:undefined reference to `pcl::PCLBase<pcl::PointXYZRGBA>:: XXX
- 直播APP源码功能详解
- linux ssh freeradius,如何将SSH身份验证配置到FreeRADIUS服务器
- wpsppt设置页码和总页数_wps的ppt页码怎么设置
- 计算机知识架构一:计算机组成、体系结构
- java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...
- 示波器测量红外遥控器晶振