01-Java注解与反射
2021-08-17 17:29:53 0 举报
AI智能生成
注解与放射的基本使用,基础知识
作者其他创作
大纲/内容
注解的应用场景
说明:注解的保留级别不同,对注解的使用自然存在不同场景
级别1:源码
APT
说明:在编译期能够获取注解与注解声明的类包括类中所有成员信息,一般用于生成额外的辅助类
级别2:字节码
字节码增强
说明:在编译出Class后,通过修改Class数据以实现修改代码逻辑目的。对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解
级别3:运行时
反射
在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定
Android注解语法检查
说明:在Android中我们需要设计接口以供使用者调用时,如出现需要对入参进行类型限定,如限定为资源ID、布局ID等类型参数,将参数类型直接给定int即可。然而,我们可以利用Android为我们提供的语法检查注解,来辅助进行更为直接的参数类型检查与提示。
参数限制为:图片资源ID
反射
说明:一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的,并且能够获得此类的引用。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。
反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是Java被视为动态语言的关键
反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。是Java被视为动态语言的关键
知识点
反射
.java -> .class 编译
.class -> .java 反编译
获取类的对象
类名.class
对象.getClass()
Class.forName("全限定名")
类.getClassLoader.loadClass("全限定名")
子类.class.getSuperClass()
包装类.class
根据类得到类名(全限定名)
getName()全限定名
getSimpleName()类名
getPackage()包名
Filed类(属性)
getField("属性名")获取公共属性
getName()属性名
getModifiers()修饰符
getType()数据类型
set(对象名属性值) = 对象名.set属性名 属性赋值
get(对象名) = 对象名.get属性名 属性取值
getDeclareField("属性名") 获取属性
setAccessible(true)设置私有属性能访问
getDeclareFields()所有属性
Method(方法)
getMethod(方法名,参数数据类型(无参数传null)) 获取公共方法
getDeclareMethod(方法名,参数数据类型(无参数传null)) 获取私有方法
incoke(对象名,参数列表) = 对象名.方法名 执行方法
getParameterTypes() 得到放回参数列表
getDeclareMethods() 得到类的所有方法
getReturnType() 得到返回值方法的数据类型
构造方法
Class对象.getConstructor() 得到构造方法
Class对象.getConstructors() 得到所有的构造方法
Java高级语言的特性
注解
反射
注解的定义
注解的作用或者意义是什么?
注解本身没有任何意义,单独的注解就是一种注释,他需要结合其他如反射、插桩等技术才有意义
Java 注解(Annotation)又称 Java 标注,是 JDK1.5 引入的一种注释机制。是元数据的一种形式,提供有关于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响
Annotation<interface>
ElementType
RetentionPolicy
Deprecated
Decumented
Inherited
Override
Retention
Target
......
元注解
说明:在定义注解时,注解类也能够使用其他的注解声明。对注解类型进行注解的注解类,我们称之为 meta-annotation
RetentionPolicy.SOURCE
标记的注解仅保留在源级别中,并被编译器忽略
RetentionPolicy.CLASS
标记的注解在编译时由编译器保留,但 Java 虚拟机(JVM)会忽略
RetentionPolicy.RUNTIME
标记的注解由 JVM 保留,因此运行时环境可以使用它
不同的注解有不同的级别
SOURCE < CLASS < RUNTIME,即CLASS包含了SOURCE,RUNTIME包含SOURCE、CLASS
Type
Type<interface>
GenericArrayType<interface>
getCenericComponenType():void
说明:当需要描述的类型是泛型类的数组时,比如List[],Map[],此接口会作为Type的实现
ParameterizedType<interface>
getActualTypeArguments():void
getRawType():void
getOwnerType():void
getRawType():void
getOwnerType():void
说明:具体的泛型类型,可以获得元数据中泛型签名类型(泛型真实类型)
TypeVariable<interface>
getBounds():void
getCenericDeclaration():void
getName():void
getCenericDeclaration():void
getName():void
说明:泛型类型变量。可以泛型上下限等信息
WildcardType<iunterface>
getUpperBounds():void
getLowerBounds():void
getLowerBounds():void
说明:通配符泛型,获得上下限信息
0 条评论
下一页