一:获取类上注解的值

定义注解@Target(ElementType.TYPE)用于类,接口等

@Target(ElementType.TYPE)

@Retention(RetentionPolicy.RUNTIME)

public @interface Orange {

String getName();

String getValue();

}

获取

@Orange(getName = "3333",getValue = "4444")

public class ParameterNameTest {

。。。

@Test

public void main() throws Exception {

Class clazz = ParameterNameTest.class;

if(clazz.isAnnotationPresent(Orange.class)){

// 获取 "类" 上的注解

Orange getAnnotation = clazz.getAnnotation(Orange.class);

System.out.println("\"类\"上的注解值获取到第一个 :"

+ getAnnotation.getName()+ ",第二个:"+ getAnnotation.getValue());

}

}

返回

"类"上的注解值获取到第一个 :3333,第二个:4444

二:获取属性变量上注解的值

定义注解@Target(ElementType.FIELD)用于属性变量

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Banana {

String length();

String price();

}

获取

public class ParameterNameTest {

@Banana(length = "6666", price = "$888")

String something = "other information";

@Test

public void main() throws Exception {

Class clazz = ParameterNameTest.class;

// 获取 "属性变量" 上的注解的值

Field[] fields = clazz.getDeclaredFields();

for(Field field: fields){

if(field.isAnnotationPresent(Banana.class)){

Banana bananaAnnotation = field.getAnnotation(Banana.class);

System.out.println("\"属性变量\"上的注解值获取到第一个 :"

+ bananaAnnotation.length()+ ",第二个:"+ bananaAnnotation.price());

}

}

}

}

返回

"属性变量"上的注解值获取到第一个 :6666,第二个:$888

三: 获取方法上注解的值

@Target(ElementType.METHOD)

@Retention(RetentionPolicy.RUNTIME)

public @interface Apple {

String color();

String number();

}

获取

public class ParameterNameTest {

@Apple(color = "红色", number = "5555")

public void method1(){

// ...

}

@Test

public void main() throws Exception {

Class clazz = ParameterNameTest.class;

// 获取 "方法"上的注解的值

Method[] methods = clazz.getDeclaredMethods();

for (Method method: methods){

if(method.isAnnotationPresent(Apple.class)){

Apple appleAnnotation = method.getAnnotation(Apple.class);

System.out.println("\"方法\"上的注解值获取到第一个 :"

+ appleAnnotation.color()+ ",第二个:"+ appleAnnotation.number());

}

}

}

}

返回

"方法"上的注解值获取到第一个 :红色,第二个:5555

三: 获取" 方法参数 " 上注解的值

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface Cherry {

String value();

}

获取

public class ParameterNameTest {

public void method2(@Cherry("1111") String param1, @Cherry("2222") String param2) {

System.out.println(param1 + param2);

}

@Test

public void main() throws Exception {

Class clazz = ParameterNameTest.class;

// 获取 "方法参数" 上的注解的值

Method method = clazz.getDeclaredMethod("method2", String.class, String.class);

String[] parameterNames = getMethodParameterNamesByAnnotation(method);

System.out.println("\"方法参数\"上的注解值获取到"+Arrays.toString(parameterNames));

}

/**

* 获取给 "方法参数" 进行注解的值

*

* @param method 要获取参数名的方法

* @return 按参数顺序排列的参数名列表

*/

public static String[] getMethodParameterNamesByAnnotation(Method method) {

Annotation[][] parameterAnnotations = method.getParameterAnnotations();

if (parameterAnnotations == null || parameterAnnotations.length == 0) {

return null;

}

String[] parameterNames = new String[parameterAnnotations.length];

int i = 0;

for (Annotation[] parameterAnnotation : parameterAnnotations) {

for (Annotation annotation : parameterAnnotation) {

if (annotation instanceof Cherry) {

Cherry param = (Cherry) annotation;

parameterNames[i++] = param.value();

}

}

}

return parameterNames;

}

}

返回

"方法参数"上的注解值获取到[1111, 2222]

小结:主要使用的API是Class类中的实现接口AnnotatedElement的方法

isAnnotationPresent --- 检测该元素是否被对应注解修饰

default boolean isAnnotationPresent(Class extends Annotation> annotationClass) {

return getAnnotation(annotationClass) != null;

}

getAnnotation --- 获取注解对象

T getAnnotation(Class annotationClass);

java element 获取属性_java 获取类,属性变量,方法,方法参数上注解的值等相关推荐

  1. java 反射 私有成员_Java对类私有变量的暴力反射技术讲解

    Java对类私有变量的暴力反射 假设有一个类,他有一个私有变量: package com.howlaa.day04; public class ReflectPoint { private int p ...

  2. java date的使用_java:Date类的概述和方法使用

    * A:Date类的概述 * 类 Date 表示特定的瞬间,精确到毫秒. * B:构造方法 * public Date() * public Date(long date) * C:成员方法 * pu ...

  3. java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...

    导航:网站首页 > C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计 C++编程:定义一个圆类要求属性为半径, ...

  4. 获取.fla所有导出类名称列表的方法

    获取.fla所有导出类名称列表的方法 获取.fla所有导出类名称列表的方法 方法是取巧的方法,生成.swc文 件,然后用zip解压,里面有个libray.xml,里面script节点描述了导出类的名称 ...

  5. java修饰符默认_Java的类,方法,变量等等的默认修饰符是什么

    访问控制修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java支持4种不同的访问权限. 默认的,也称为default,在同一包内可见,不使用任何修饰符. 私有的,以pr ...

  6. java 默认参数_Java 方法的参数可以有默认值吗?

    Java 方法的参数可以有默认值吗? 例如 void method(String p1, int p2, bool p3=false); 回答 Java不支持这种特性, 如果你真的有需求,你可以 通过 ...

  7. java属性_Java Properties 类

    Java Properties 类 Properties 继承于 Hashtable.表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串. Properties 类被许多 Java 类使用 ...

  8. 时间日期类JAVA包含地区属性_Java常用类 | 时间和日期类

    开发中经常涉及到时间与日期,记录下Java中与时间和日期相关的API JDK8之前与时间日期相关的类 java.lang.System类 System类提供了一个公共的静态方法currentTimes ...

  9. java 遍历类属性_Java 遍历类中的属性

    public static void testReflect(Object model) throwsNoSuchMethodException, IllegalAccessException, Il ...

最新文章

  1. I/O流。简单利用File.copy
  2. 【JavaScript】jQuery绑定事件
  3. 友商逼急 雷急跳墙:生死看淡 不服就干
  4. RabbitMq常见问题
  5. python变量后面加星号_Python基础找茬系列20--python函数的秘密
  6. warshall算法求传递闭包c++_【建模小课堂】图论算法
  7. php5.5.* mysqlnd驱动安装
  8. Java String substring()方法示例
  9. MyBatis关联映射
  10. Java学习笔记之设计模式(4)适配器模式
  11. 嵌入SpreadJS,赋能计量器具检定信息化
  12. 无人机倾斜摄影在矿山测量测绘中有哪些应用
  13. 创新之道,亚马逊创新之旅背后的故事
  14. POI 颜色Color
  15. Dev C++ 下载地址和安装教程
  16. POI检查EXCEL版本(2003或2007)
  17. 【评测】SF9/SF21昆虫细胞培养基
  18. 追求自由的穷游网---十年一剑
  19. ci框架 反向代理配置_通过 nginx-proxy 实现自动反向代理和 HTTPS
  20. Mysql数据库视频教程

热门文章

  1. 仔细讨论 C/C++ 字节对齐问题⭐⭐
  2. 捕获分组和非捕获分组以及命名分组
  3. Android高级控件(二)——SurfaceView实现GIF动画架包,播放GIF动画,自己实现功能的初体现...
  4. gSoap的“error LNK2001: 无法解析的外部符号 _namespaces”解决方法
  5. Nagios监控Windows主机
  6. 【原创】自动更新程序2--更新程序的主窗体(技术:spring.net+三层架构+webservice+IrisSkin2换肤)...
  7. 疯狂的程序员-第三章
  8. 用户sa 登陆失败 SQLServer 错误18456 图解
  9. c++ 6.0 没有找到mspdb60.dll 问题的解决
  10. deepin linux深度ISO镜像下载地址