`

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

阅读更多

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





 

分享到:
评论

相关推荐

    java 通过反射获取类上注解,方法上注解,注解里的值及方法参数

    本教程将深入探讨如何通过反射获取类、方法上的注解以及注解中的值和方法参数。 1. **注解的定义与使用** 注解以`@`符号开头,后面跟着注解的类型。例如,`@Override`表示方法重写,`@Deprecated`表示某个功能已...

    通过反射获得实体类的字段和值

    在深入探讨如何通过反射获取实体类的字段和值之前,我们先来理解一下反射是什么以及它在.NET框架中的作用。反射是一种强大的编程技术,允许运行时动态地获取类型的信息并操作对象。它提供了对程序集、模块、类型、...

    java注解之运行时修改字段的注解值操作

    在上面的代码中,我们使用了 Java 的反射机制来获取注解的值。 结论 Java 注解之运行时修改字段的注解值操作是非常有用的技术,可以帮助我们在实际开发中更方便地处理和修改代码。本文主要介绍了 Java 注解之运行...

    servlet反射注解例子

    然后,通过反射获取注解的值,并根据这些信息注册Servlet。这使得我们的代码更加模块化,也便于使用依赖注入和其他高级功能。 此外,我们还可以使用`java.lang.reflect`包中的类,如`Class`、`Method`和`Field`,在...

    运用注解改变反射之后类属性的顺序

    然而,当我们通过反射获取类的属性时,可能会遇到一个常见的问题:属性的顺序并不总是按照我们期望的方式呈现。默认情况下,Java反射API(如`Field[] getDeclaredFields()`方法)返回的字段数组顺序与它们在源代码中...

    利用反射,注解将数据输出至Excel中

    在`export`方法中,我们可以使用`java.lang.reflect`包下的API来获取`User`类的字段,然后检查它们是否包含`@ExcelField`注解。对于每个带有注解的字段,我们从对应的用户对象中获取值,并将其写入Excel工作表的相应...

    java自定义注解和通过反射获取注解

    注解(Annotation)是一种元数据,提供了在编译时和运行时对代码进行标记的方法,而反射(Reflection)则是Java提供的一种能力,允许程序在运行时检查和操作类、接口、字段和方法等对象。接下来,我们将深入探讨这两...

    利用反射实现的增删改查操作的底层代码

    1. **字段映射**:通过反射获取类的Field对象,我们可以知道类的属性及其类型。这有助于将对象的属性值转换为SQL语句中的参数,例如,使用PreparedStatement的set方法设置参数。 2. **动态SQL**:通过反射,我们...

    注解+反射实现自定义验证工具,可实现业务校验,字段多种校验

    本验证工具的核心思想是通过定义一系列自定义注解来标识需要验证的字段或方法,并通过反射技术动态获取这些注解信息来进行验证。这样做的好处是可以将验证逻辑与业务逻辑分离,使得验证规则更加清晰明了,同时也方便...

    反射,注解原理和使用的方法

    - 运行时处理:通过反射获取类、方法、字段上的注解,如`Class.getAnnotations()`、`Method.getAnnotation(MyAnnotation.class)`。 4. **注解的应用场景**: - AOP(面向切面编程):例如Spring框架中的切面注解...

    注解反射生成SQL语句

    在这个例子中,我们可以通过反射获取`User`类上的`@Table`注解,并从中提取出"users"作为表名;同样,可以获取`username`字段上的`@Column`注解,得到"username"作为列名。然后,我们就可以基于这些信息生成如下的...

    Java利用反射获取类信息

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段以及方法的信息。通过反射,开发者可以动态地创建对象、调用方法、访问字段,甚至修改类的行为。这个过程通常...

    《利用反射技术处理自定义注解》的设计与实现 AnnotationPrj.7z

    《利用反射技术处理自定义注解》的设计与实现,旨在探讨如何结合这两种机制以实现更灵活、高效的代码处理。 在这个项目中,`AnnotationPrj` 分为四个主要部分:`annotation`、`deal`、`domain` 和 `test`,以及一个...

    注解框架实体类映射

    总的来说,"注解框架实体类映射"是SSH2框架中利用Java注解来定义和管理数据库表的一种方法,它减少了XML配置,增强了代码的可读性,并结合Spring和Hibernate的能力,实现了高效的数据操作和业务逻辑处理。...

    利用java反射、注解及泛型模拟ORM实现

    1. 反射(Reflection):Java反射机制允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用其方法。通过`Class`类,我们可以实例化未知类型的对象,调用私有方法,访问私有字段,以及检查类的...

    655.653.JAVA基础教程_反射-获取运行时类的接口、所在包、注解等(655).rar

    这个教程"655.653.JAVA基础教程_反射-获取运行时类的接口、所在包、注解等(655)"将深入讲解如何利用反射获取关于类的各种元数据,包括接口、包信息以及注解。以下是对这些知识点的详细解释: 1. 反射的概念与作用:...

    Java的反射机制讲解案例代码 Class类、 获取类的结构信息:构造函数、方法和字段,动态创建对象、调用方法和设置属性

    内容概要 Java的反射机制是指在运行时通过分析类的信息实现动态调用类的方法和访问类的属性...掌握反射机制的目标是能够在运行时获取类的信息,并灵活地利用这些信息来完成所需的操作,以增加程序的灵活性和可扩展性。

    java注解、java反射机制 jdbc 封装

    本案例通过注解的方式,简化了JDBC操作数据库的过程,并利用反射机制动态地调用这些操作。 首先,让我们详细了解Java注解。Java注解是一种元数据,它提供了一种安全的方法来将信息附加到代码中,而不会改变其语义。...

    java注解_反射_字节码_类加载机制.zip

    它能获取类的结构(如类名、字段、方法),创建对象,调用方法,访问私有成员。反射是许多框架(如Spring、Hibernate)的基础,用于实现动态代理、元编程等功能。然而,反射的使用应谨慎,因为它可能会降低性能且...

    使用annotation获取实体类注释

    `java.lang.reflect`包中的`Class`, `Method`, `Field`等类提供了`getAnnotations()`、`getDeclaredAnnotations()`等方法来获取类、方法或字段上的注解。 5. **示例代码分析**: - `Sfe.java`: 可能是一个实体类,...

Global site tag (gtag.js) - Google Analytics