Java Annotation详解(二): 反射和Annotation

简介:

前面一篇文《Java Annotation详解(一): 理解和使用Annotation》中,我们或许会觉得,Annotation注释其实并没有多大的作用,除了几个内建的Annotation偶尔为了消除警告会使用下,自定义Annotation大家在实际的开发中应该都没有用过。其实呢,我在毕业后一年的工作里,也从未自定义使用过Annotation,只是在多处开发中使用过注释方便的内容,比如Servlet,Spring以及一些优秀的Android开源类库。 如果从简单的开发来讲,大家基本会使用一些开源的工具(只使用Annotation编写的)就好了,但是,如果大家能深入的了解Annotation,对大家学习这些开源框架将更有帮助。

Annotation何时才变得有意义呢? 如果结合反射,取得Annotation中设置的全部内容,Annotation的意义才会被最大化。


在以下的类中Class Constructor Field Method Package等类都实现了AnnotatedElement接口
在接口中有以下重要的方法:
· getAnnotations(Class annotationType)获取一个指定的annotation类型
· getAnnotations() 获取所有的Annotation
· getDeclaredAnnotations() 获取声明过的所有Annotation
· isAnnotationPresent(Class<? extends Annotation> annotationClass)这个annotation是否出现

通过这些方法,配合反射我们就可以在程序运行时拿到注解的内容了,例子如下:

首先定义一个普通的含有内建注释的类:

package com.test.reflectannotation ;
public class SimpleBeanOne{
	@SuppressWarnings("unchecked") 
	@Deprecated
	@Override
	public String toString(){
		return "Hello World!!!" ;
	}
};
接下来,我们通过反射取出Annotation内容要注意,只有Deprecated的Annotation的定义范围是RUNTIME范围,所以此时通过反射的话,只能取得一个。

import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class ReflectDemo01{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		Class <?> c = null ;
		c = Class.forName("com.test.SimpleBeanOne") ;
		Method toM = c.getMethod("toString") ;	// 找到toString()方法
		Annotation an[] = toM.getAnnotations() ;	// 取得全部的Annotation
		for(Annotation a:an){	// 使用 foreach输出
			System.out.println(a) ;
		}
	}
};
输出:

@java.lang.Deprecated()

以上,我们取得的是内建的Annotation,接下来,我们自己定义一个Annotation:

package com.test.reflectannotation ;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
@Retention(value=RetentionPolicy.RUNTIME)	// 此Annotation在类执行时依然有效
public @interface MyDefaultAnnotationReflect{
	public String key() default "Linkage" ;
	public String value() default "沉缘" ;

}
我们通过RetentionPolicy指定了其值为RUNTIME,在运行时有效。

package com.test.reflectannotation ;
public class SimpleBeanTwo{
	@SuppressWarnings("unchecked") 
	@Deprecated
	@Override
	@MyDefaultAnnotationReflect(key="Baidu",value="www.baidu.com")
	public String toString(){
		return "Hello World!!!" ;
	}
};

通过反射取得指定的Annotation,因为现在唯一设置的内容就是MyDefaultAnnotationReflect。

import org.lxh.demo16.reflectannotation.MyDefaultAnnotationReflect ;
import java.lang.annotation.Annotation ;
import java.lang.reflect.Method ;
public class ReflectDemo{
	public static void main(String args[]) throws Exception{	// 所有异常抛出
		Class <?> c = null ;
		c = Class.forName("com.test.reflectannotation.SimpleBeanTwo") ;
		Method toM = c.getMethod("toString") ;	// 找到toString()方法
		if(toM.isAnnotationPresent(MyDefaultAnnotationReflect.class)){
			// 判断是否是指定的Annotation
			MyDefaultAnnotationReflect mda = null ;
			mda = toM.getAnnotation(MyDefaultAnnotationReflect.class) ;	// 得到指定的Annotation
			String key = mda.key() ;	// 取出设置的key
			String value = mda.value() ;	// 取出设置的value
			System.out.println("key = " + key) ;
			System.out.println("value = " + value) ;
		}
	}
};

输出: 

key = Baidu
value = www.baidu.com

总结:

Annotation在实际的开发中,不管如何使用,其最终肯定结合反射机制,也就是说可以通过Annotation设置一些内容到方法上去,已完成特定的功能。


此外,发现有篇博客写的不错,是关于注解和反射的,可以参考:http://blog.csdn.net/a396901990/article/details/27961663


相关文章
|
15天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
11 0
[Java]反射
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
60 9
Java——反射&枚举
|
26天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 2
|
2月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
24天前
|
IDE Java 编译器
java的反射与注解
java的反射与注解
14 0
|
2月前
|
Java 程序员 编译器
Java的反射技术reflect
Java的反射技术允许程序在运行时动态加载和操作类,基于字节码文件构建中间语言代码,进而生成机器码在JVM上执行,实现了“一次编译,到处运行”。此技术虽需更多运行时间,但广泛应用于Spring框架的持续集成、动态配置及三大特性(IOC、DI、AOP)中,支持企业级应用的迭代升级和灵活配置管理,适用于集群部署与数据同步场景。
|
2月前
|
存储 安全 Java
扫盲java基础-反射(一)
扫盲java基础-反射(一)
|
2月前
|
Java
扫盲java基础-反射(二)
扫盲java基础-反射(二)
|
4月前
|
安全 Java 测试技术
day26:Java零基础 - 反射
【7月更文挑战第26天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
34 5
|
3月前
|
缓存 安全 Java
【Java 第十篇章】反射
Java 反射技术让程序能在运行时动态获取类信息并操作对象,极大提升了灵活性与扩展性。本文将介绍反射的基本概念、原理及应用,包括如何使用 `Class`、`Field`、`Method` 和 `Constructor` 类进行动态操作。此外,还将探讨反射在动态加载、框架开发与代码测试中的应用场景,并提醒开发者注意性能与安全方面的问题,帮助你更合理地运用这一强大工具。
28 0