Java中的注解和反射实例详解
一、注解
注解(annotation): 从jdk5.0开始引进,可以对程序进行解释或被其他程序读取。
注解格式:"@注释名",并可以添加一些参数。
例:@myannotation(value=‘value')
1、内置注解
@override: 用于修饰方法,表示该方法声明是重写或实现一个父类的方法
@deprecated: 用于修饰方法、属性、类,表示已过时不建议使用的
@suppresswarnings: 用于抑制编译时的警告信息
2、元注解
作用:用于注解其他注解
@target: 用于描述注解的适用范围
例:@target(elementtype.annotation_type) 适用范围为注解定义
@retention: 表示需要在什么级别保存该注解信息
source - 源码级别
class - class级别
runtime - 运行级别
source < class < runtime
例:@retention(retentionpolicy.runtime) 此注解运行时有效
@documented: 表示是否将注解生成在javadoc中
@inherited: 表示子类可以继承父类的注解
3、自定义注解
注解定义:@interface+注解名
测试:
二、反射
反射(reflection)是java被视为动态语言的关键,反射机制允许程序在执行期借助于reflection api取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
优缺点:具有灵活性但是效率较低。
class c = class.forname(java.lang.string)
1、class类
某个类的属性、方法和构造器、某个类实现了哪些接口,jre都为其保留了一个不变的class类型的对象,同一个类的所有对象共享同一个class对象。
class类具有以下特点:
- class本身也是一个类
- class对象只能由系统建立对象
- 一个加载的类在jvm中只会有一个class实例
- 一个class对象对应的是一个加载到jvm中的一个class文件
- 每个类的实例都会记得自己是由哪个class实例所生成
- 通过class可以完整地得到一个类中的所有被加载结构
- class类是reflection的根源,针对任何想动态加载、运行的类,唯有先获得相应的class对象
class类的常用方法:
方法名 | 功能说明 |
---|---|
static class.forname(string name) | 返回指定类名name的class对象 |
object newinstance() | 调用缺省构造函数,返回class对象的一个实例 |
getname() | 返回此class对象所表示的实体(类、接口、数组类或void)的名称 |
class getsuperclass() | 返回当前class对象的父类class对象 |
class[] getinterfaces() | 返回当前class对象的接口 |
class loader getclassloader() | 返回该类的类加载器 |
constructor[] getconstructors() | 返回一个包含某些constructor对象的数组 |
method getmethod(string name ,class t) | 返回一个method对象,此对象的形参类型为paramtype |
field[] getdeclaredfields | 返回field对象的一个数组 |
2、通过反射获取class对象:
所有的类都可以通过反射获取其class对象。
下面通过例子列举获取类的class对象的三种方式:
输出结果:
结论:三种方式获取的class对象为同一个。
3、获取类的运行时结构
4、通过反射构造对象
5、通过反射获取注解的信息
创建类和注解
测试
总结
到此这篇关于java中的注解和反射的文章就介绍到这了,更多相关java注解和反射内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!