博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用反射获取类或者方法或者字段上的注解的值
阅读量:5980 次
发布时间:2019-06-20

本文共 3644 字,大约阅读时间需要 12 分钟。

从JDK1.5之后,注解在各大框架上得到了广泛的应用。下面这个例子中,你可以判断一个类或者方法或者字段上有没有注解,以及怎么获取上面的注解值。话不多说,代码如下:

AnnotationTest01.java

package com.zkn.newlearn.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.METHOD,ElementType.PARAMETER})public @interface AnnotationTest01 {	String color();}
AnnotationTest02.java

package com.zkn.newlearn.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public @interface AnnotationTest02 {		String getUserName();}
AnnotationTest04.java

package com.zkn.newlearn.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.TYPE,ElementType.FIELD})public @interface AnnotationTest04 {		String getAddress();}
AnnotationTest03.java

package com.zkn.newlearn.annotation;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;/** * 测试Annotation * @author zkn * */@AnnotationTest02(getUserName="zhangsan")public class AnnotationTest03 {	@AnnotationTest01(color="red")	public static String testColor(String color){		System.out.println(color);		return color;	}		@AnnotationTest04(getAddress="北京市海淀区")	String address;		public static void main(String[] args) {		//获取方法上的注解值		Method[] methods = AnnotationTest03.class.getDeclaredMethods();		if(methods != null){			for(Method method : methods){				AnnotationTest01 annotation = method.getAnnotation(AnnotationTest01.class);				if(annotation == null)					continue;				Method[] me = annotation.annotationType().getDeclaredMethods();				for(Method meth : me){					try {						String color = (String) meth.invoke(annotation,null);						System.out.println(color);					} catch (IllegalAccessException e) {						e.printStackTrace();					} catch (IllegalArgumentException e) {						e.printStackTrace();					} catch (InvocationTargetException e) {						e.printStackTrace();					}				}			}		}		//获取类上的注解值		AnnotationTest02 anno = AnnotationTest03.class.getAnnotation(AnnotationTest02.class);		if(anno != null){			Method[] met = anno.annotationType().getDeclaredMethods();			for(Method me : met ){				if(!me.isAccessible()){					me.setAccessible(true);				}				try {					System.out.println(me.invoke(anno, null));				} catch (IllegalAccessException e) {					e.printStackTrace();				} catch (IllegalArgumentException e) {					e.printStackTrace();				} catch (InvocationTargetException e) {					e.printStackTrace();				}			}		}				//获取字段上的注解值		AnnotationTest03 noon = new AnnotationTest03();		Field[] field = AnnotationTest03.class.getDeclaredFields();		if(field != null){			for(Field fie : field){				if(!fie.isAccessible()){					fie.setAccessible(true);				}				AnnotationTest04 annon = fie.getAnnotation(AnnotationTest04.class);				Method[] meth = annon.annotationType().getDeclaredMethods();				for(Method me : meth){					if(!me.isAccessible()){						me.setAccessible(true);					}					try {						//给字段重新赋值						fie.set(noon, me.invoke(annon, null));						System.out.println(fie.get(noon));					} catch (IllegalAccessException e) {						e.printStackTrace();					} catch (IllegalArgumentException e) {						e.printStackTrace();					} catch (InvocationTargetException e) {						e.printStackTrace();					}				}							}		}	}}

转载地址:http://zhlox.baihongyu.com/

你可能感兴趣的文章
深浅拷贝 python
查看>>
C++ gui程序附加dos输出窗口
查看>>
jQuery验证控件jquery.validate.js使用说明+中文API
查看>>
Linux 查看.so中导出函数
查看>>
数组中简便方法求最大值,最小值,平均值,求和,和个数
查看>>
洛谷P4219 大融合
查看>>
adb 查看 android手机的CPU架构
查看>>
Java概述
查看>>
Windows 8 Metro App开发[8]处理Fullscreen, Snapped和Filled状态
查看>>
步步为营 .NET 设计模式学习笔记 十五、Composite(组合模式)
查看>>
【Redis篇】初始Redis与Redis安装
查看>>
关于List<T>集合中的差集
查看>>
Vue-router路由判断页面未登录跳转到登录页面
查看>>
Sql异常①
查看>>
leetcode-205-Isomorphic Strings
查看>>
Ubuntu下Apache2+Tomact7安装、配置及整合
查看>>
c++重载与覆写
查看>>
使用 JavaScript 将网站后台的数据变化实时更新到前端-【知乎总结】
查看>>
Java基础之j简析avax.swing.JOptionPane(一)showMessageDialog
查看>>
信息资源管理的标准与法规
查看>>