JAVA类加载、反射和注解

#一、类加载概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。

虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。

java安全沙箱(一)之ClassLoader双亲委派机制

#二、类加载工作机制 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤:

 (1) 装载:查找和导入Class文件;

 (2) 链接:把类的二进制数据合并到JRE中;

    (a)校验:检查载入Class文件数据的正确性;

    (b)准备:给类的静态变量分配存储空间;

    (c)解析:将符号引用转成直接引用;

 (3) 初始化:对类的静态变量,静态代码块执行初始化操作

输入图片说明

#三、类加载方式 1、命令行启动应用时候由JVM初始化加载
2、通过Class.forName()方法动态加载
3、通过ClassLoader.loadClass()方法动态加载

#四、反射 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能。

主要提供了以下功能: 在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法,生成动态代理。

利用Reflection APIs取得任何已知名称的类的内部信息,包括:package、 type parameters、 superclass、 implemented interfaces、 inner classes、 outer classes、 fields、 constructors、 methods、 modifiers等,并可以在执行的过程中,动态生成instances、变更fields内容或唤起methods。

  1. 获取构造方法

// 根据构造函数的参数,返回一个具体的具有public属性的构造函数
Constructor getConstructor(Class[] params)

// 返回所有具有public属性的构造函数数组
Constructor getConstructors()

// 根据构造函数的参数,返回一个具体的构造函数(不分public和非public属性)
Constructor getDeclaredConstructor(Class[] params)

// 返回该类中所有的构造函数数组(不分public和非public属性)
Constructor getDeclaredConstructors()

  1. 获取类的成员方法

// 根据方法名和参数,返回一个具体的具有public属性的方法 Method getMethod(String name, Class[] params)

// 返回所有具有public属性的方法数组 Method[] getMethods()

// 根据方法名和参数,返回一个具体的方法(不分public和非public属性) Method getDeclaredMethod(String name, Class[] params)

// 返回该类中的所有的方法数组(不分public和非public属性) Method[] getDeclaredMethods()

  1. 获取类的成员变量(成员属性)

// 根据变量名,返回一个具体的具有public属性的成员变量 Field getField(String name)

// 返回具有public属性的成员变量的数组 Field[] getFields()

// 根据变量名,返回一个成员变量(不分public和非public属性) Field getDeclaredField(String name)

// 返回所有成员变量组成的数组(不分public和非public属性) Field[] getDelcaredFields()

#五、注解 Annotation其实是一种接口。通过Java的反射机制相关的API来访问annotation信息。相关类(框架或工具中的类)根据这些信息来决定如何使用该程序元素或改变它们的行为。

Annotation是不会影响程序代码的执行,无论annotation怎么变化,代码都始终如一地执行。 Java语言解释器在工作时会忽略这些annotation,因此在JVM中这些annotation是“不起作用”的,只能通过配套的工具才能对这些annontaion类型的信息进行访问和处理。

Annotation与interface的异同:

  • Annotation类型使用关键字@interface而不是interface。这个关键字声明隐含了一个信息:它是继承了java.lang.annotation.Annotation接口,并非声明了一个interface;
  • Annotation类型、方法定义是独特的、受限制的。Annotation 类型的方法必须声明为无参数、无异常抛出的。这些方法定义了annotation的成员:方法名成为了成员名,而方法返回值成为了成员的类型。而方法返回值类型必须为primitive类型、Class类型、枚举类型、annotation类型或者由前面类型之一作为元素的一维数组。方法的后面可以使用 default和一个默认数值来声明成员的默认值,null不能作为成员默认值,这与我们在非annotation类型中定义方法有很大不同。Annotation类型和它的方法不能使用annotation类型的参数、成员不能是generic。只有返回值类型是Class的方法可以在annotation类型中使用generic,因为此方法能够用类转换将各种类型转换为Class。

Annotation类型又与接口有着近之处:

  • 可以定义常量、静态成员类型(比如枚举类型定义)。Annotation类型也可以如接口一般被实现或者继承。

转载于:https://my.oschina.net/u/1446182/blog/783610

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值