利用反射获取类或者方法或者字段上的注解的值

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

从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();
					}
				}
				
			}
		}
	}
}





相关文章
|
2月前
通过反射获取方法返回的类型
通过反射获取方法返回的类型
14 1
|
10月前
|
Java 编译器 测试技术
手写反射实现读取自定义注解中的属性值
手写反射实现读取自定义注解中的属性值
|
11月前
|
XML Java Maven
可以让反射获取到方法参数实际的变量名设置
可以让反射获取到方法参数实际的变量名设置
122 0
|
Java 关系型数据库 MySQL
如何使用@Value注解为bean的属性赋值呢
如何使用@Value注解为bean的属性赋值呢
|
Java 程序员 API
枚举,注解 ,反射
枚举,注解 ,反射
56 0
|
Java 数据库
java反射机制查找类的属性并赋值
先说一下需求:最近做一个项目其中需要将前台传来的数组存到数据库,但是这个表里有15个字段,集合是不固定的,然后要把这个集合的数值赋给这个类的相应属性,然后存到数据库中。集合长度应小于等于这个类属性的个数。
278 0
|
XML Java 数据格式
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
121 0
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
|
XML Java 数据格式
注解与反射关联的应用(三)
注解与反射关联的应用(三)
注解与反射关联的应用(三)
Java反射 - 字段
使用Java反射,您可以检查类的字段(成员变量)并在运行时获取/设置它们。 这是通过Java类java.lang.reflect.Field完成的。 本文将更详细地介绍Java Field对象。
715 0