Java 使用反射获取类、方法、属性上的注释

有的时候我们想使用反射获取某个类的注释、方法上的注释、属性上的注释。

下面是一个简单的例子。里面包括了上面提到的三个点。

package com.mine.practice.reflectfield;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

/**
  *
  * @author 2014-11-10 下午01:54:48
  * @version V1.0
 */
@XmlRootElement(name="user")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {

	private String pwd;

	@XmlElement(name = "ID")
	private int id;

	@XmlAttribute
	@XmlElement
	private String name;

	/***
	 *  1、获取属性上的指定类型的注释
	 *  2、获取属性上的指定类型的注释的指定方法
	 *  3、获取属性上的所有注释
	 *  4、获取类上的所有注释
	 *  5、获取方法上的所有注释
	  * @author 2014-11-10 下午02:18:24
	  * @param args
	 */
	@SuppressWarnings("rawtypes")
	public static void main(String[] args) {

		Field[] fields =  User.class.getDeclaredFields();

		for(Field f : fields){
			String filedName = f.getName();
			System.out.println("属性名称:【"+filedName+"】");

			//1、获取属性上的指定类型的注释
			Annotation annotation = f.getAnnotation(XmlElement.class);

			//有该类型的注释存在
			if (annotation!=null) {
				//强制转化为相应的注释
				XmlElement xmlElement = (XmlElement)annotation;
				//3、获取属性上的指定类型的注释的指定方法
				//具体是不是默认值可以去查看源代码
				if (xmlElement.name().equals("##default")) {
					System.out.println("属性【"+filedName+"】注释使用的name是默认值: "+xmlElement.name());
				}else {
					System.out.println("属性【"+filedName+"】注释使用的name是自定义的值: "+xmlElement.name());
				}
			}

			//2、获取属性上的所有注释
			Annotation[] allAnnotations = f.getAnnotations();

			for(Annotation an : allAnnotations){

				Class annotationType = an.annotationType();

				System.out.println("属性【"+filedName+"】的注释类型有: " + annotationType);
			}
			System.out.println("----------华丽的分割线--------------");
		}

		//4、获取类上的所有注释
		Annotation[] classAnnotation = User.class.getAnnotations();

		for(Annotation cAnnotation : classAnnotation){
			Class annotationType =  cAnnotation.annotationType();
			System.out.println("User类上的注释有: " +annotationType);
		}

		System.out.println("----------华丽的分割线--------------");

		// 5、获取方法上的所有注释
		Method method;
		try {
			method = User.class.getMethod("setPwd",String.class);

			Annotation[] methodAnnotations = method.getAnnotations();

			for(Annotation me : methodAnnotations){
				Class annotationType =  me.annotationType();
				System.out.println("setPwd方法上的注释有: " + annotationType);
			}
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		}
	}

	@XmlElement
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getPwd() {
		return pwd;
	}
}

运行结果如下所示

属性名称:【pwd】
----------华丽的分割线--------------
属性名称:【id】
属性【id】注释使用的name是自定义的值: ID
属性【id】的注释类型有: interface javax.xml.bind.annotation.XmlElement
----------华丽的分割线--------------
属性名称:【name】
属性【name】注释使用的name是默认值: ##default
属性【name】的注释类型有: interface javax.xml.bind.annotation.XmlAttribute
属性【name】的注释类型有: interface javax.xml.bind.annotation.XmlElement
----------华丽的分割线--------------
User类上的注释有: interface javax.xml.bind.annotation.XmlAccessorType
User类上的注释有: interface javax.xml.bind.annotation.XmlRootElement
----------华丽的分割线--------------
setPwd方法上的注释有: interface javax.xml.bind.annotation.XmlElement
时间: 2024-10-10 20:12:55

Java 使用反射获取类、方法、属性上的注释的相关文章

java 通过反射获取类属性结构,类方法,类父类及其泛型,类,接口和包

首先自定义三个类 package reflection1; public interface MtInterface { void info(); } package reflection1; import java.io.Serializable; public class Creature<T> implements Serializable { private char gender; public double weight; private void breath() { Syste

[转]java 通过反射获取类的全局变量、方法、构造方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.str; public class ZiFuChuan {          public static String ss = "全局变量!!!!!!";     String s2 = null;     public int aa = 1 ;     int aa2;     double dou = 1.1;     Double d = new Dou

java 利用反射获取类对象中List的值

Field[] fields = Object.getClass().getDeclaredFields();//Object是已经被赋值的对象实例 for (Field field : fields) {if (!field.isAccessible()) { field.setAccessible(true); } if (List.class.isAssignableFrom(field.getType())) { Type t = field.getGenericType(); if (

iOS 反射获取类的属性列表

// 获取对象所有属性: - (NSArray*)propertyKeys { unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([self class], &outCount); NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount]; for (i = 0; i < outCount; i+

java 通过反射获取调用类方法及属性

首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做这些事,一般反射大多是用于在构建类的实例以及调用类方法及属性. ok! 了解了反射是什么以及反射的应用领域,那么就来看看Java中是怎么实现反射的吧 Student类 public class Student {     public String name;     public String g

C# 使用反射获取类的成员变量名、方法及属性的若干笔记

参考链接:http://blog.csdn.net/ccaakkee/article/details/2425950,作者:CSDN ccaakkee   http://blog.csdn.net/jaydawson/article/details/5539438,作者:CSDN jaydawson 代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys

java通过反射获取调用变量以及方法

一:反射概念 可以通过Class类获取某个类的成员变量以及方法,并且调用之. 二:通过反射获取方法.变量.构造方法 1 @Test 2 // 通过反射获取类定义的方法 3 public void testMethod() throws Exception { 4 @SuppressWarnings("rawtypes") 5 Class clazz = Class.forName("java.lang.String"); 6 Method[] m = clazz.g

反射获取类的几种方法

1 public class Demo { 2 3 /** 4 * 反射:加载类,获得类的字节码 5 * @param args 6 * @throws ClassNotFoundException 7 */ 8 public static void main(String[] args) throws ClassNotFoundException { 9 10 //1 11 Class clazz = Class.forName("Person"); 12 13 //2 14 Cla

java的接口、类、属性、方法各有哪些修饰符

参考博客:http://blog.csdn.net/cao_tao199612/article/details/7458245 1. 接口的修饰符只有:public 2. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 public : Java 语言中类 的可访问控制符只有一个: public 即公共的.每个 Java 程序的主类都必须是 public 类