韩顺平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)
java.lang.Class.getDeclaredMethod()方法用法
注:方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。
描述:
java.lang.Class.getDeclaredMethod()方法返回一个Method对象,它反映此Class对象所表示的类或接口的指定已声明方法。
name 参数是一个字符串,指定所需的方法的简单名称,
parameterTypes 参数是一个数组的Class对象识别方法的形参类型,在声明的顺序:
public Method getDeclaredMethod(String name, Class... parameterTypes) throws NoSuchMethodException,SecurityException
参数
name -- 方法的名称
parameterTypes -- (方法的)参数数组
返回值
匹配指定名称和参数的类的方法,此方法返回的Method对象
第三组
第四组
通过反射创建对象
通过反射访问类中成员
- 成员
- 方法
类加载
-
基本说明
-
类加载的时机
-
类加载五个阶段
加载和连接是由JVM进行的,堆区的Class对象是一个数据结构也是数据的访问入口(?没懂),初始化可以由程序员指定(静态变量、代码快等)
加载阶段详解:
连接阶段详解:
说明——
验证:对文件的安全进行校验——文件描述符、元数据、字节码文件的安全性
准备:对静态变量进行默认初始化,并分配空间
解析:把常量池内的符号引用转换为直接引用(真正的内存地址)——JVM机完成
初始化阶段详解:
- 如果直接调用类的静态属性也会导致类的加载
- 正因为有这个机制,才能保证某个类在内存中,只有一份Class对象
Class类
- 类图
- 基本介绍
- 常用方法及演示:
- 获取Class类对象
根据Java程序运行的三个阶段+类加载器 获取 一共四个主要方法
int 和 Integer 对应的Class对象是同一个(hashcode相同)
- 拥有Class对象的元素类型
因为Class也是一种类所以也有对应的Class对象
本文来自博客园,作者:紫英626,转载请注明原文链接:https://www.cnblogs.com/recorderM/p/15866355.html