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

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

			}
		}
	}
}
时间: 2025-01-27 08:46:37

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

利用反射获取方法参数对象的泛型定义

问题描述 利用反射获取方法参数对象的泛型定义 public CommonRsp<AAARsp> hotelCheckAvailability(CommonReq<BBBReq> req) throws Exception; 如何通过反射获取如上方法中的参数泛型定义BBBReq? 解决方案 你这是java语法吗,如果是的话,其实java的泛型本质上是糖衣语法,编译后泛型是会被擦除的.你获取泛型本质上是没有意义的,应该是获取不到的.

go语言通过反射获取和设置结构体字段值的方法_Golang

本文实例讲述了go语言通过反射获取和设置结构体字段值的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: type MyStruct struct {         N int } n := MyStruct{ 1 } // get immutable := reflect.ValueOf(n) val := immutable.FieldByName("N").Int() fmt.Printf("N=%d\n", val) // prints

Rtti单元(1)获取类的方法、属性、字段的列表

通过 Rtti 单元的 TRttiContext(是个 record), 可以方便地获取类的方法.属性.字段的列表. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TB

Android利用反射获取状态栏(StatusBar)高度

MainActivity如下: package cc.teststatusbarheight; import java.lang.reflect.Field; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.co

Java反射之通过反射获取一个对象的方法信息(实例代码)_java

以下代码为一个工具类 package com.imooc.reflect; import java.lang.reflect.Method; public class ClassUtil { public static void printClassMessage(Object obj){ //要获取类的信息,首先要获取类的类类型 Class c = obj.getClass();//传递的是哪个子类的对象,c就是该子类的类类型 //获取类的名称 System.out.println("类的名称

Java反射高级应用--利用反射调用类的私有方法修改私有方法值,以及替换Java的类成员数据

  package me.test; import java.lang.reflect.*;  //导入反射需要的包 public class ReflectTest {  public static void main(String[] args)  throws  Exception  {       /*  下面通过反射完成对一个对象中成员的替换    *   并且执行执行私有方法     *   完成对 Poiont类的对象中所有的 String的对象的d换成x    *   并且类中无

Java 反射获取类详细信息的常用方法总结_java

类ReflectionDemo 复制代码 代码如下: package Reflection; @Deprecated public class ReflectionDemo {     private String pri_field;     public String pub_field;     public ReflectionDemo(){}     public ReflectionDemo(String name){}     private ReflectionDemo(Stri

利用反射获取静态变量值的问题.

问题描述 publicclassSVC(){publicstaticintcount=0;}privatevoidtest118(objectobj,stringname){while(true){Thread.Sleep(1);Console.WriteLine(obj.GetType().GetFields().FirstOrDefault(f=>f.Name==name).GetValue(obj));}}privatevoidbuttonLogin_Click(objectsender,

Java中利用反射实现类的动态加载

//首先定义一个接口来隔离类: public interface Operator { // public java.util.List act(java.util.List params); public java.util.List act(String content,String content2,java.util.List params); } 根据设计模式的原理,我们可以为不同的功能编写不同的类,每个类都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很