注解与反射
Posted limengkun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解与反射相关的知识,希望对你有一定的参考价值。
一、注解(annotation)
1、注解定义
(1) 注解:也叫元数据,标签,注释,注解是给程序看的,而java注释是给程序员看的;它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
②JDK内置四大注解:
@Override:验证子类是否覆写父类方法成功
@SuppressWarnings:抑制警告(抑制那条黄色的线)
@Deprecated 申明 类或者方法。。。已经过期
@SafeVarargs:抑制警告(java7之后,它专门提供了此注解来抑制使用可变参数和泛型方法带来的警告)
③ 自定义注解(需要使用元注解)
什么叫做元注解: 简单理解,就是贴在注解上的注解
四大元注解:
1. @Target 申明该注解最终能贴的位置
2. @Retention 表示注解的生命周期
RESOURCE注解只存在于源文件时期;
CLASS注解只存在于源文件和字节码时期
RUNTIME注解存在于源文件、字节码和运行时期
3. @Documented 使用@Documented定义后的注解,在该注解使用后,如果导出API文档,会有该注解的基本信息
4. @Inherited 如果该注解是定义在父类上面的,子类也是能被继承到的
③、语法格式
元注解
public @interface 注解名{
数据类型 属性名() [default 默认值]; [ ]里面的值是可要可不要的,但 是<>里面的值是必须要的
}
注解类型是和类、接口、枚举等一个级别的,要定义一个注解我们需要使
用@interface关键字,同时需要注意定义的注解名前是不需要使
用@符号的,但是在使用的时候,必须是@符号加上注解名。
使用注解:
@注解名(属性名=”值”)
@注解名(属性名={”值1”,”值2”}) //注解类型为数组
获取属性值的方式:
注解名.属性名();
④注意事项
如果注解里面属性只有1个,并且属性名叫做value(其他属性名不能省略),
使用的时候value是可以省略的;如果你的属性名是value,并且它是一个数
组类型, 使用的时候,只有1个值, {}与value都是可以省略的,如果你
是多个值,{}一定不能省。
二、反射(reflect)
1、反射的理解
使用一种技术在程序运行时就能去操作java对象中的属性、方法、构造方法等(底层的操作)。
2、学习反射的目标
1.创建这个类的对象
2.调用这个类的方法
3.给这个类的字段设置值,获取字段的值
3、ClassNotFoundException(没有找到字节码文件)异常处理
出现这个异常的原因及解决办法:
1.就是你的目标类没有编译成字节码文件---------》1.project--clean
2.修改字节码输出目录
3.重启eclipse(重新编译字节码文件)
4、获取字节码对象
①获取类的字节码对象:
1. 类型.class
2. 对象.getClass();
3. Class.forName("全限定名")
全限定名: 包名+类名
获取全限定名的快捷的方式:选中类型或者接口名或者注解名(注解也是一种接口),然后右键,选择Copy Qualified Name
②获取接口的字节码对象(接口不能创建对象,注解也是一种接口):
1.接口.class
2.Class.forName("全限定名")
③获取数组的字节码对象(拿不到全限定名可以理解为全限定名被隐藏了,因此拿不到全限定名):
1.类型.class
2.对象.getClass();
③获取基本数据类型的字节码对象
1.类型.class
2.包装类.TYPE
④无返回值类型void
1. Void 类是一个不可实例化的占位符类,它持有对表示 Java 关键
2. 字 void 的 Class 对象的引用。
5、获取构造方法及创建对象的方法
Constructor[] getConstructors() 获取类中所有公共的构造方法。(反射里面获取公共的什么指的是权限修饰符)
Constructor<T> getConstructor(Class<?>... parameterTypes) 获取指定的公共构造方法。
Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 返回类中指定的构造方法(所有修饰符的都行)
Constructor<?>[] getDeclaredConstructors() 获取所有的构造方法(所有修饰符的都行)
Constructor类中有一个创建有参(无参)对象的方法: T newInstance(Object... initargs)
Class类中有一个创建无参对象的方法:T newInstance()
虽然说获取了这个构造方法,但是他是私有的,并不能在外面直接使用, 因此我们需要使用忽略他的权限访问修饰符,AccessibleObject 类是Constructor、Field、Method三个类的父类,这个类中提供了一个忽略权限访问修饰符的方法: void setAccessible(boolean flag)
1、获取方法及调用方法
Method getMethods() 获取类中所有的的公共方法(包括父类的)
Method getMethod(String name(方法名), Class<?>... parameterTypes) 获取类中指定的公共方法
Method getDeclaredMethod() 返回类中所有的方法
Method getDeclaredMethod(String name, Class<?>... parameterTypes) 返回类中指定的方法
Object invoke(Object obj, Object... args) 第一个参数表示的是要掉用获取的方法的对象,第二个参数表示获取的方法参数
2、获取所有的字段以及字段的赋值和取值
Field getField(String name) 返回指定的公共字段。
Field[] getFields() 返回所有的公共字段
Field getDeclaredField(String name) 返回指定的字段
Field[] getDeclaredFields() 获取所有的字段
void set(Object obj, Object value) 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。
Object get(Object obj) 返回指定对象上此 Field 表示的字段的值。
获取全限定名
Class类里面的getName方法返回的是全限定名
获取类名
Class类里面的getSimpleName方法返回的是类名
以上是关于注解与反射的主要内容,如果未能解决你的问题,请参考以下文章