高级特性:反射、代理 [JVM角度,看待类的运行]
思考 |
Q1:给定一个类的名字(字符串形式),怎么创建该类的对象。 #1.手写一个类 #2.反射:字符串,获取类,以及类对象的机制。 Q2:什么是反射机制?refelct Q3:静态代理与动态代理的异同? Q4:类如何进行加载 #源文件—类文件—装入内存 |
一、反射机制
背景:Java类型信息 |
#获取Java运行时的类型信息的两种方法 ##1>RTTI (Run-Time Type Identification) ##2>Java发射机制 #RTTI ##目的:运行时,识别对象的类型。 ##读取对象:类型转换是在运行时进行正确性检查 (存储:实现类 \ 读取:实现类——>接口) ##优点:代码少了解对象的具体类型,只与对象家族中的一个通用表打交道 |
Java反射机制 |
定义:动态获取信息以及动态调用对象方法的功能。 在运行状态中, 对于任意一个类,都能够知道这个类的属性和方法; 对于任意一个对象,都能调用它的任意方法和属性。 |
内容 |
类Object: 类Class : Class类是Java一个基础类,每装载一次新类的时候,Java虚拟机就会在Java堆中,创建一个Class的实例,这个实例就是代表这个Class类型,通过实例获取类型信息。 类Method 类Field:域 类Constructor:构造器 #方法对比 ##Class类方法:Method[] getMethods()、Field[] getFields()、Constructor<?>[] getDeclaredConstructors ##Object类方法:hashCode()、equals()、clone()、toString()、notify()、wait() #利用Class类创建实例 ##创建Class类的一个对象,返回一个类的引用 [ Class类的对象,表达一个类的引用 ] ###Class cls = Class.forName("Airplane"); //返回一个类型 静态方法 ##通过类的引用创建实例 ###cls.newInstance();//通过newInstance创建实例,一般调用默认的构造函数 [ 类型:Airpane,调用Airpane默认的构造方法] #创建实例 ##传统方法 Airplane ap = new Airplane(); 已有类,创实例 动态方法 已有类创建实例 ##反射方法 Class cls = Class.forName("Airplane"); 创类 静态方法 字符串创建实例 ap = cls.newInstance() 创实例 及动态方法 Method类 #Method类中invoke反射:invoke方法对带有指定参数的指定对象,调用由此Method对象表示的基础方法 [Method类,对象,表示任意一个类中的某一个方法 \invoke()方法,调用原来类中的方法] ##>1创建方法类 Method mth = ClassA.class.getMethod(methodName,methodArgs[]); ##>2调用类方法 mth.invoke(ClassA.class.newInstance(),new ArgType1(arg1),new ArgType2(arg2)); |
二、静态代理
代码
一反射机制 |
1.利用Class类创建实例 2.反射例子-Method类的invoke |
二、静态代理 |