注解与反射

一、注解(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方法返回的是类名

原文地址:https://www.cnblogs.com/limengkun/p/10777125.html

时间: 2024-11-05 19:04:39

注解与反射的相关文章

Java高级之注解、反射

Java的注解.反射等机制的产生,让动态代理成为可能,一般通过全限定名+类名,找到类,可以invoke它的构造方法以及其他方法,可以获取它的参数(Field)名称和值. 注解一般用在代码的注释上.代码审查上(有没有按标准写,比如inspect).代码注入(hook,asbectj),需要考虑的是,在何时注入(编译期还运行期) 反射一般用在动态将json和Object互相转化,执行相关底层代码,比如设置某个类的Accessible为false,防止别人hook修改 例:阿里的FastJson解析:

利用注解和反射将map转化成bean

一.java注解 java注解相关的类放在 java.lang.annotation 包下,其主要内容包含4个元注解和其中两个元注解的枚举类值,相对比较简单,从jdk问答即可了解 4个元注解: Documented:指示某一类型的注释将通过 javadoc 和类似的默认工具进行文档化.应使用此类型来注释这些类型的声明:其注释会影响由其客户端注释的元素的使用.如果类型声明是用 Documented 来注释的,则其注释将成为注释元素的公共 API 的一部分. Inherited:指示注释类型被自动继

理解Android中的注解与反射

前言 最近一段时间在研究EventBus和Retrofit 的过程中,都遇到了注解这个概念.由于在学习Java的时候对这方面没有深入了解过,所以看起相关的代码来,总会有点不知其所以然,这里就注解和反射的使用做一下总结. 这里我们先从反射说起,了解了反射的意义及用法后,我们在看看注解的使用,最后叙述一下在Android开发中是怎样结合使用注解与反射. 反射 Java反射(Reflection)定义 Java反射机制是指在运行状态中 对于任意一个类,都能知道这个类的所有属性和方法: 对于任何一个对象

java自定义注解与反射

java注解与反射一.Java中提供了四种元注解,专门负责注解其他的注解,分别如下 1.@Retention元注解,表示需要在什么级别保存该注释信息(生命周期).可选的RetentionPoicy参数包括: RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认) RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注

[杂记]自定义注解以及反射的应用

序:对于注解的认知是从spring开始的,不管是aop还是ioc,对于其概念是比较清楚的,但真正的实现却没有一个比较好的认知,前段时间看了下<从零开始写web框架>,但当时看的比较仓促,再说因为时间的原因,并没有细揪很多东西,这两天研究了下公司一个系统的代码,突然间对于这块有了比较好的理解,故做潦草记录. 项目使用自定义注解和反射主要是为了在webSocket请求发过来的时候,通过请求中的参数定位到类和方法,然后去执行具体的业务逻辑,具体整个流程如下. 1.自定义注解 @Target(Elem

java注解和反射的结合使用

首先反射注解,那么保留策略必须是Runtime,也就是@Retention(RetentionPolicy.RUNTIME) ①定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface MyAnnotation { int value(); } ②在定义一个类使用注解类 public class MyBean { @MyAnnotation(20) private int

java注解和反射制作dao基类的练习

首先是三个注解 主键注解 package comments; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lan

注解与反射 ---Spring与Mybatis等框架的实现原理

Java中各大框架,无论是AOP 还是 IoC 其基本实现思路都是源自Java 运行时支撑的反射功能, 而反射最基本的一点就是 任何一个类 其在JVM环境中,都有一个对象的Class对象,这个对象提供一些方面描述了类的 方法 构造函数 注解 等等等 下面就是一个反射跟注解的小例子,是一个比较好入门的小demo 理解之后,几乎所有的框架都是依照这个思路来实现的 package pw.jonwinters.annotation; import java.lang.annotation.Documen

使用自定义注解和反射 ,自动生成查询语句

1.自定义表名注解 package com.lf.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //自定义表名注解 @Target(ElementType.TYPE) @Retention(Reten

注解和反射

一.注解 英文:Annotation 1.1 注解的概念 注解也叫元数据,用来标记代码,描述数据,是有特殊意义的. 1.2 注解作用 1.Javadoc将文档注释生成api文档时,会将一些注解内容生成到Api文档中,如               @return @see @param 2.编译时进行格式检查,如@Override 3.使用注解,减少配置文件,如框架中. 4.抑制警告 1.3 四个内置注解 就是java写好的注解,直接用. @Override:标记重写方法 @Deprecated