JAVA类加载、反射和注解

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

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

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

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

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

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

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

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

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

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

输入图片说明

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

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

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

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

  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()

#5、注解 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类型也能够如接口通常被实现或者继承。
相关文章
相关标签/搜索