注解与反射

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.给这个类的字段设置值,获取字段的值

3ClassNotFoundException(没有找到字节码文件)异常处理

出现这个异常的原因及解决办法:

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方法返回的是类名

以上是关于注解与反射的主要内容,如果未能解决你的问题,请参考以下文章

注解与反射

注解与反射

Java反射反射与注解

注解与反射-复习

Java---注解与反射

理解Android中的注解与反射