以下实例,定义一个注解。通过反射获取。

主要功能:为所注解过的参数和方法附加一些信息可以获取。

定义注解。

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)相关推荐

  1. Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)

    1. 概述 os 包提供了操作系统函数的不依赖平台的接口.失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.例如,如果某个使用一个文件名的调用(如Open.Stat)失败了,打印错误时会包含 ...

  2. android浏览器获取设备id,H5能获取到手机设备ID或者手机浏览器唯一识别码吗

    content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no"> JS获取手机型 ...

  3. android 指定资源id,Android 通过名称获取资源ID

    当我们获取网络数据的时候,解析之后往往都是一个字符串,而不是资源id,所有我们没有办法直接使用,只能通过名称来获取到资源id, package com.example.administrator.de ...

  4. java注解,通过反射解析注解,模仿hibernate,获取sql语句。

    常用注解: 自定义注解,标准格式: 1,target:注解作用域 2,Retention:声明周期 运行子类继承,但是子类继承只能作用到类注解,字段注解,是继承不了的. 使用注解:通过下面这种方式,为 ...

  5. Java笔记-通过反射获取注解及Spring中获取某包下的所有class文件

    首先来看看使用反射来获取注解名: 只需在获取class后调用getAnnotation方法即可,如下 这里是获取JPA映射b表名,Table.class,使用下面这个可以获取表名 import jav ...

  6. java 反射 参数名_JAVA 8 反射获取参数名

    前言 在JDK8之前javac编译是不会把构造器和方法的参数名编译进class中,如果需要获取参数名,可以在方法上加上注解,反射获取注解的值从而获取参数名,比如Jackson的@JsonCreator ...

  7. java 反射 找不到方法_Java获取反射的三种方法

    class Student { private int id; String name; protected boolean sex ; pub1ic f1oat score; } pub1ic cl ...

  8. java 反射调用方法_java的反射机制,以及通过反射获取方法,变量等操作

    我们应用会用到反射这个知识点,肯定是想要在运行时得到类的信息,根据类的那些信息去做一些特定的操作.那么,首先无疑就是得到类的信息,在JDK中提供了Class对象来保存类的信息.所以,反射的第一步就是得 ...

  9. Java反射机制demo(四)—获取一个类的父类和实现的接口

    2019独角兽企业重金招聘Python工程师标准>>> Java反射机制demo(四)-获取一个类的父类和实现的接口 1,Java反射机制得到一个类的父类 使用Class类中的get ...

最新文章

  1. [转]C#日期格式化 文档
  2. 方案 mysql 优点_mysql高可用方案分析
  3. 3.依赖注入 spring_di
  4. 【mongoDB】 备份
  5. 学习threeJS(一)--第一个threeJs
  6. HBase键值分片的简单运用
  7. 1106: 回文数(函数专题)
  8. 离散点自动生成等高线_有限自动机| 离散数学
  9. DHCP服务器异常,上不了网解决办法
  10. Linux连接mysql 出现Access denied for user ‘root‘@‘localhost‘(using password: YES)错误解决方案
  11. FastHook——实现.dynsym段和.symtab段符号查询
  12. 163网站顶部展出的大幅广告
  13. 歇后语:有牌不胡偏要杠
  14. 解决PCL 编译报错:undefined reference to `pcl::PCLBase<pcl::PointXYZRGBA>:: XXX
  15. 直播APP源码功能详解
  16. linux ssh freeradius,如何将SSH身份验证配置到FreeRADIUS服务器
  17. wpsppt设置页码和总页数_wps的ppt页码怎么设置
  18. 计算机知识架构一:计算机组成、体系结构
  19. java节假日算法_「国家法定节假日」java 国家法定节假日和双休日判断工具类 - seo实验室...
  20. 示波器测量红外遥控器晶振

热门文章

  1. pytorch之创建数据集
  2. 基于水平集方法和G0模型的SAR图像分割
  3. C语言实现文件复制 fgetc、fputc函数的使用 带详细注释版
  4. 吴恩达神经网络和深度学习-学习笔记-21-何时该改变开发集+测试集或指标
  5. 微服务架构系列文章、精品教程
  6. 原生JS 将canvas生成图片
  7. 关于博主 | 联系博主
  8. Centos如何通过yum安装php7
  9. 使用C#开发纽曼USB来电小秘书客户端小结
  10. WPF:在XmlDataProvider上使用主-从绑定(Master-Detail Binding)