【JAVA SE基础篇】67.反射机制介绍

1.动态语言

程序在运行的时候,可以改变程序结构或变量类型。

典型的语言:Python,ruby,javascript等

例:javascript代码:

function test(){

  var s="var a=3;var b=5;alert(a+b);":  

  eval(s);

}

c,c++,java不是动态语言,java是“准动态语言”。

但是java有一定的动态性,我们可以利用反射机制,字节码的操作获得类似动态语言的特性

java的动态性让编程更加灵活

2.反射机制介绍(reflection)

指的是可以运行时加载,探知,使用编译期间完全未知的类

程序在运行状态中,可以动态加载一个只有名称的类

对于任意一个已加载的类,都能够知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性

Class c =Class.forName(“”);

加载完类之后,在堆内存中,产生一个Class类型的对象(一个类只有一个Class对象)

这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。

这个对象就像一面镜子,透过镜子看到类的结构,称位反射。

例:

 注:java.lang.Class类十分特殊,用来表示java中的类型本身

Class类的对象包含了某个加载类的结构。一个被加载的类对应一个Class对象

当一个Class被加载,或当加载器(class loader)的defineClass()被JVM调用,JVM便自动产生一个Class对象

Class类是反射的根本,任何想动态加载、运行的类,唯有先获得相应的Class对象

3.获取Class类对象的方法

1.getClass()

2.Class.forName()

3..class语法

例;

4.反射机制的性能

setAccessible提高反射性能

用法:

  1.启用和禁用访问安全检查的开关,值为true则指示反射的对象在使用时应该取消java语言访问检查

值为false则指示反射的对象应该实施java语言访问检查。并不是为true就能访问,为false就不能访问

  2.禁止安全检查,可以提高反射的运行速度

5.反射机制的常见作用

1.动态加载类、动态获取类的信息(属性、方法、构造器)

2.动态构造对象

3.动态调用类和对象的任意方法、构造器

4.动态调用和处理属性

5.获取泛型信息

java中采用泛型擦除机制来引入泛型。java中泛型只给编译器看,确保数据安全型和免去强制类型转换的麻烦

一旦编译完成,所有泛型有关的类型全部擦除,而反射操作的是加载好的类,看不泛型。

为了通过反射操作此类型以迎合实际开发需求,java新增了ParameterizedType,GenericArrayType

TypeVariable和WildcardType几种类型来代表不能被归一到Class类中的的类型但是又和原始类型齐名的类型

ParameterizedType:表示一种参数化的类型,比如Collection<String>

GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数组类型

TypeVariable:是各种类型变量的公共父接口

WildcardType:代表一种通配符类型表达式

 

6.处理注解

原文地址:https://www.cnblogs.com/chengkuan/p/13427165.html