韩顺平Java40——反射
反射(reflection)
- 引出
开闭原则(ocp原则):
软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。 实现动态编程(动态地创建和使用对象)
快速入门代码演示:
package com.recorder.question; /** * @author 紫英 * @version 1.0 * @discription Cat类 */ public class Cat { private String name = "小丁猫"; public void cry(){ System.out.println(name + "喵喵叫~"); } public void run(){ System.out.println(name + "嗷嗷跑~"); } } :
classPath=com.recorder.question.Cat method=cry
package com.recorder.question; import java.io.FileInputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Properties; /** * @author 紫英 * @version 1.0 * @discription 反射入门案例 */ public class Reflection01 { public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException { Properties properties = new Properties(); properties.load(new FileInputStream("src\\cat.properties")); String classpath = properties.getProperty("classPath"); String methodName = properties.getProperty("method"); //加载类,创建Class类型的对象cls Class<?> cls = Class.forName(classpath); //通过cls得到你加载的类(com.recorder.question.Cat)的对象实例 Object o = cls.newInstance(); //对象实例对应的方法名的Method对象 Method method = cls.getMethod(methodName); //通过方法对象来调用方法 method.invoke(o); } }
反射机制
Java程序在计算机的三个阶段
反射机制作用
反射相关类(四个主要)
反射优缺点
反射调优——关闭访问检查
通过反射获取类的结构信息
第一组
第7条修正——不包括父类的,只有本类puclic的
输出时使用对应类型的数组存储,然后增强for输出
第二组
注意——组合形式的话会将值都加起来(public static = 8 + 1 = 9)
第三组
第四组
通过反射创建对象
通过反射访问类中成员
- 成员
- 方法
类加载
-
基本说明
-
类加载的时机
-
类加载五个阶段
加载和连接是由JVM进行的,堆区的Class对象是一个数据结构也是数据的访问入口(?没懂),初始化可以由程序员指定(静态变量、代码快等)
加载阶段详解:
连接阶段详解:
说明——
验证:对文件的安全进行校验——文件描述符、元数据、字节码文件的安全性
准备:对静态变量进行默认初始化,并分配空间
解析:把常量池内的符号引用转换为直接引用(真正的内存地址)——JVM机完成
初始化阶段详解:
- 如果直接调用类的静态属性也会导致类的加载
- 正因为有这个机制,才能保证某个类在内存中,只有一份Class对象
Class类
- 类图
- 基本介绍
java虚拟机Class对象是放在 方法区 还是堆中 ?
- 常用方法及演示:
- 获取Class类对象
根据Java程序运行的三个阶段+类加载器 获取 一共四个主要方法
int 和 Integer 对应的Class对象是同一个(hashcode相同)
- 拥有Class对象的元素类型
因为Class也是一种类所以也有对应的Class对象