java ----> 注解/反射
注解
一个例子,摘自Junit-4.12.jar源码。
1 @Retention(RetentionPolicy.RUNTIME)
2 @Target({java.lang.annotation.ElementType.METHOD})
3 public @interface Test{
4
5   //......
6 }
关注两个元注解和两个类,它们位于java.lang.annotation包中。
@Retention(RetentionPolicy.RUNTIME)
@Target(java.lang.annotation.ElementType.METHOD)
1、@Retention和RetentionPolicy
@Retention
表示要保留带注释类型的注释的时间长度。可以理解为注解的生命周期。 如果注释类型声明中不存在Retention注释,则保留策略默认为RetentionPolicy.CLASS。
RetensionPolicy
注释保留策略。RetensionPolicy是一个枚举类型的类。 此枚举类型的常量描述了用于保留注释的各种策略。 它们与Retention元注释类型结合使用,以指定保留注释的时间。有三个枚举类型的常量,分别是SOURCE,CLASS,RUNTIME。它们分别对应java源文件阶段,class文件阶段,内存中的字节码阶段。(参考博客:https://www.cnblogs.com/xdp-gacl/p/3622275.html)
SOURCE:表示编译器会丢弃注解。
CLASS:这是默认的保留策略。表示编译器会在类文件中记录注解,但是在运行时VM不会保留注解。
RUNTIME:表示编译器会在类文件中记录注解,并且在运行时VM会保留注解。可以通过反射技术读取注解。
2、@Target和ElementType
@Target
表示注释类型可用的上下文环境。
ElementType
元素类型。ElementType是一个枚举类型的类。描述了注解在java编程中可能出现的语法位置。 它们与Target元注释类型结合使用,以指定给定类型的注解的合法位置。有10个枚举类型的常量,分别是TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE、PACKAGE、TYPE_PARAMETER、TYPE_USE
TYPE:类,接口(包括注解),枚举声明
FIELD:字段(包括枚举的常量)声明
METHOD:方法声明
PARAMETER:格式化参数声明
CONSTRUCTOR:构造器声明
LOCAL_VARIABLE:局部变量声明
ANNOTATION_TYPE:注解类型声明
PACKAGE:包声明
定义一个注解
 public @interface FirstAnnotation{}
注解的本质
注解是一个特殊的类,更像是一个接口。
注解和反射的关系
说明:ClassName表示某个类的名称;AnnotationName表示某个注解的名称。
通过反射技术可以获取注解的信息。
获取注解:Method#getAnnotation(AnnotationName.class)
或者:ClassName.class.getAnnotation(AnnotationName.class)
检查注解是否存在:ClassName.class.isAnnotationPresent(AnnotationName.class)
反射
1、反射:在运行状态中,动态获取对象的信息或者动态调用对象的方法的技术。
2、RTTI(run-time type identification),运行时类型识别,在运行时识别一个对象的类型和类的信息。两种方式:编译期已经知道所有类型;通过反射机制在运行时获取类型的信息。
3、Class:java中获取运行时类型信息的类。
Class对象的作用:为Java虚拟机(JVM)创建实例对象或者提供静态变量的引用值的媒介。Class对象由类加载器子系统加载到JVM中。Class对象是被按需加载的。
获取Class对象的方式:
1)、Class.forName("...")
2)、ClassName.class,不会触发类的初始化
3)、obj.getClass()
4、类的加载过程:
加载 -> 链接(验证->准备->解析)->初始化
加载:已加载字节码文件,可通过它创建Class对象
链接:
验证:安全性和完整性
准备:为静态变量分配空间
解析:处理类中的其他所有引用
初始化:对超类初始化和静态变量,静态代码块等初始化。
5、关注一个类和一个类库:
java.lang.Class
方法:
forName("指定类的全限定名") // 获取Class对象的引用
newInstance() // 实例化默认构造方法
①构造方法
getConstructor(指定参数类型,一个或者多个) // 获得指定参数类型的public构造方法,只有一个
getConstructors() // 获得所有public构造方法
getDeclaredConstructor(指定参数类型,一个或者多个) // 获得指定参数类型的构造方法(包括private),只有一个
getDeclaredConstructors() // 获得全部的构造方法(包括private),返回数组
②属性
getField("指定属性名称") // 获得指定名称 的public属性,属性必须存在
getField() // 获得所有public属性,包括父类,属性必须存在
getDeclaredField("指定属性名称") // 获得指定名称的属性(包括private),不包含父类的属性
getDeclaredField() //获得所有声明的属性(包括private),返回数组,不包含父类的属性
③方法
getMethod("指定方法名称",指定参数类型) // 获得指定方法名称和参数类型的public方法
getMethods() // 获得所有public方法
getDeclaredMethod("指定方法名称") //获得指定方法名称的方法(包括private),不包含父类的方法
getDeclaredMethods() // 获得所有声明的方法(包括private),返回数组,不包含父类的方法
java.lang.reflect类库,类库中常用的几个类:Constructor,Field,Method。
①Constructor
getParameterTypes() // 获得构造方法参数类型,返回Class类型数组
getDeclaringClass() //返回Class对象,可以用过Class.getName()获得类的全限定名
getGenericParameterTypes() // 获得构造方法的形参类型,返回Type类型数组。
newInstance(Object... initargs) // 通过构造方法创建实例
②Field
setAccessible(true) // 设置该private属性可以被访问到,false表示该属性不可被访问到
getType() // 返回该属性声明的类型
getName() // 返回指定field的名字
get(Object obj) // 返回指定field的值
set(Object obj, object value) // 重新设置指定field的值
③Method
setAccessible(true) //设置该private方法可被访问,false表示该方法不可被访问到
invoke(Object obj,Object... args) // 调用指定方法名和参数的方法
getReturnType() // 获得方法的返回类型
getName() // 获得方法名称
参考:《jdk1.8.0_172-src》《jdk1.8.0_172-docs-all》
java ----> 注解/反射的更多相关文章
- Java注解教程:自定义注解示例,利用反射进行解析
		
Java注解能够提供代码的相关信息,同时对于所注解的代码结构又没有直接影响.在这篇教程中,我们将学习Java注解,如何编写自定义注解,注解的使用,以及如何使用反射解析注解. 注解是Java 1.5引入 ...
 - Java学习:注解,反射,动态编译
		
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解 什么是注解 ? Annotat ...
 - Java的反射和代理以及注解
		
最近接触到java的反射和代理(接触的有点迟了...),还是有必要总结下 1. Java的反射 有的时候我们需要在程序运行的时候获取类.方法等信息用于动态运行,这个时候反射就能够帮我们找到类.方法.成 ...
 - Java注解(Annotation)用法:利用注解和反射机制指定列名导出数据库数据
		
闲来没事,想了一个应用的例子:用java如何把数据库的数据根据我们指定的某几列,如第2列,第4列,第6列导出来到Excel里? 写代码也是为了应用的,写好的代码更重要的是在于思考.我自己思考了这个示例 ...
 - java 注解annotation的使用,以及反射如何获取注解
		
一.注解基本知识 1.元注解 元注解是指注解的注解.包括 @Retention @Target @Document @Inherited四种. 1. Annotation型定义为@interfac ...
 - (转)秒懂,Java 注解 (Annotation)你可以这样学     ---- 重要 注解定义与反射解析
		
转:http://blog.csdn.net/briblue/article/details/73824058 文章开头先引入一处图片. 这处图片引自老罗的博客.为了避免不必要的麻烦,首先声明我个人 ...
 - java基础(反射,注解,多线程,juc)
		
JAVA基础 java反射 class对象 三种方式获取class加载时对象 1.class.forName("全类名"):将字节码文件加载进内存,返回class对象 2.类名.c ...
 - Java注解与反射
		
概要 本文主要是总结Java注解与反射的相关知识,加深自己对Java类动态语言的理解,同时为日后学习Spring打下基础. 注解: 什么是注解 Annotation的作用 不是程序本身,但是可以对程序 ...
 - 小白都能学会的Java注解与反射机制
		
前言 Java注解和反射是很基础的Java知识了,为何还要讲它呢?因为我在面试应聘者的过程中,发现不少面试者很少使用过注解和反射,甚至有人只能说出@Override这一个注解.我建议大家还是尽量能在开 ...
 
随机推荐
- 算法基础_递归_给定m个A,n个B,一共有多少种排列
			
问题描述: 给定m个A,n个B,一共有多少种排列 解题源代码: /** * 给定m个A,n个B,问一共有多少种排列 * @author Administrator * */ public class ...
 - MySQL优化小结
			
数据库的配置是基础.SQL优化最重要(贯穿始终,每日必做),由图可知,越往上优化的面越小,最基本的SQL优化是最重要的,往上各个参数也没太多调的,也不可能说调一个innodb参数性能就会好多少,而动不 ...
 - LeetCode 206 Reverse Linked List 解题报告
			
题目要求 Reverse a singly linked list. Example: Input: 1->2->3->4->5->NULL Output: 5-> ...
 - javaweb(4)之Listener&Filter
			
监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...
 - window.onload和jquery等待加载的区别
			
1.区别 window.onload是等待页面所有文档,图片等元素都加载完成再进行操作,是javascript原生语法. jquery是等待页面文档加载完成时,就进行操作. $(function(){ ...
 - 2018年工作终总结&规划
			
收获满满的2018 收获总结: 1. 换了家有地区牌照的公司,薪酬涨了那么一点点,但是工作压力.强度下降不少,这样有更多时间来学习新知识. 2. 跟同事一起接了维护后台管理系统的私活,每个月多了一点点 ...
 - vue 的进度条组件
			
先看效果: 要想实现如上图的,进度跳效果,有两种方式,首先介绍第一种: 1.自己用 div 写一个,代码如下 <template> <div class="mfc-slid ...
 - #WEB安全基础 : HTTP协议 | 0x4  各种协议与HTTP协议的关系(一个报文的旅行)
			
报文是怎么旅行的呢? 在网络中有很多引路人,如HTTP协议,IP协议.TCP协议.DNS协议以及ARP协议. 请看下图,演绎一个报文的旅程 这就是一个报文的完整请求过程,请加以理解并记忆 //本系列教 ...
 - 蓝桥杯 基础训练 2n皇后
			
数月前做的2N皇后基本看书敲代码的,然后发现当时的代码不对,正好做到算法提高的8皇后·改,顺便把以前的代码顺带改了下,题目如下: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋 ...
 - ASP.NET页面之间传值的方式之Session(个人整理)
			
Session Session在ASP.NET中,表示客户端(Goggle,Firefox,IE等)与服务器端的会话,用来存储特定会话信息,准确来说,是用来存储特定用户信息.当客户端向服务器发送一个请 ...