注解和反射

注解

元注解

@Target定义注解的作用目标

**用于描述注解的范围,即注解在哪用。**它说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)等。取值类型(ElementType)有以下几种:
CONSTRUCTOR:用于描述构造器
FIELD:用于描述域即类成员变量
LOCAL_VARIABLE:用于描述局部变量
METHOD:用于描述方法
PACKAGE:用于描述包
PARAMETER:用于描述参数
TYPE:用于描述类、接口(包括注解类型) 或enum声明
TYPE_PARAMETER:1.8版本开始,描述类、接口或enum参数的声明
TYPE_USE:1.8版本开始,描述一种类、接口或enum的使用声明

@Retention定义注解的保留策略

  • SOURCE : 保留在源文件
  • CLASS : 保留在class文件
  • RUNTIME : 保留在运行时

@Inherited说明子类可以继承父类中的该注解

  • 用于表示某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Documented说明该注解将被包含在javadoc中

在这里插入图片描述

反射

Java Reflection

Reflection(反射) 是Java被视为动态语言的关键反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任何对象的内部属性及方法。

**加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。**我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射

在这里插入图片描述
在这里插入图片描述

优点:可以实现动态创建对象和编译,体现出很大的灵活性

缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于直接执行相同的操作。

在这里插入图片描述

获取Class类的实例

在这里插入图片描述
在这里插入图片描述

基本概念:类加载的过程大致分为三个阶段
1.加载阶段:本阶段主要把class的二进制代码加载进入JVM,并且进行常量池(类名,方法名,字段名),方法区(二进制字节码),(本地方法栈结构),(java.lang.class对象)的设置。

有三个加载类:

Bootstrap ClassLoader,加载jre/lib/下的类;
Extension ClassLoader:加载jre/lib/ext下的类;
ApplicationClassLoader:加载classpath下的类(应用程序自己开发的类,如 工程目录/bin/下的.class文件)
还有一个扩展的加载类,满足应用程序的特殊需求。类的加载时,父亲loader优先执行load动作,父亲load不了时,子类运作。

**2.链接阶段:**又分为三个小阶段 校验,准备,解析。
校验:实施字节码文件的格式,语法等的校验。
准备:对静态变量申请存储空间,并设置默认的初始值。如:private static int a =2;那么在准备阶段a被设置为0;
解析:把方法区中的符号指针替换为直接引用。

3.初始化阶段:对静态变量进行初始化,执行静态块,创建类的实例。上述的a变量在初始化阶段会被设置为2。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

反射的相关方法:

getName():获得类的完整名字。
newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

getFields():获得类的public类型的属性。
getDeclaredFields():获得类的所有属性。

getMethods():获得类的public类型的方法。
getDeclaredMethods():获得类的所有方法。
getMethod(String name, Class[] parameterTypes):获得类的特定方法。

getModifiers()和Modifier.toString():获得属修饰符,例如private,public,static等
getReturnType():获得方法的返回类型
getParameterTypes():获得方法的参数类型

getConstructors():获得类的public类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法。

getSuperclass():获取某类的父类
ic类型的构造方法。
getConstructor(Class[] parameterTypes):获得类的特定构造方法。

getSuperclass():获取某类的父类
getInterfaces():获取某类实现的接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值