ErCargo's Coffee Time

以大多数人的努力程度之低,根本轮不到拼天赋

Action Conquers Fear, Impetuous, Indolence and so on. (行动能够克服一切恐惧,浮躁,懒惰)


Welcome to star and fork my github

Java 类加载之反射机制

Java 反射机制

能够动态获取信息、动态调用对象方法,即: 在运行过程中:

  • 对任意一个「类」都能知道它的属性和方法;
  • 对任意一个「对象」,都能调用它的任意方法和属性;

e.g:

public class RobotTest {
    private String name;

    public void sayHi(String helloSentence){
        System.out.println(helloSentence + "" + name);
    }

    private String throwHello(String tag){
        return "Hello" + tag;
    }
}
public class ReflectSample {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
        Class rt = Class.forName("com.ercargo.restart.RobotTest");
        // 创建实例
        RobotTest r = (RobotTest) rt.newInstance();
        System.out.println("Class name is" + rt.getName());
        // getDeclaredMethod 获取所有声明的方法,但不能获取继承的方法和实现的接口的方法
        Method getHello = rt.getDeclaredMethod("throwHello", String.class);
        // 私有方法
        getHello.setAccessible(true);

        Object str = getHello.invoke(r, "World");
        System.out.println("success reflect getHello method " + str);

        /** ---- 另一种方法 ---- **/
        // getMethod() 只能获取公共方法, 也能获取继承类的公用方法,和接口实现的公用方法
        Method sayHi = rt.getMethod("sayHi", String.class);
        sayHi.invoke(r,"Welcome");

        // 获取私有类型的属性
        Field field = rt.getDeclaredField("name");
        field.setAccessible(true);
        field.set(r, "WWWWWWorld");
        sayHi.invoke(r, "Welcome  ");
    }
}

Q: 反射为什么能在运行时获取类的属性和方法,并对其进行调用?

 运行时获取类的属性和方法,并对其进行调用,就必须要获取 class 对象,获取类的 class 对象,就必须要获取该类的字节码文件

继续探索:Java字节码学习笔记

最近的文章

Java 内存模型

内存简介 JVM 架构图 Java 内存模型内存 计算机程序都是在内存中运行的(包括虚拟内存)在程序运行过程中, 需要不断的将内存的「逻辑地址」和「物理地址」进行映射,找到相关的【指令】以及【数据】去执行逻辑地址 -> 分段管理机制 -> 线性地址 -> 分页管理机制 -> 物理地址Java 程序实际上是一个操作系统进程, 与其他进程一样面临内存限制,即受限于操作系统架构提供的「可寻址地址空间」 (可寻址地址空间由处理器的位数决定(32位/64位)...…

继续阅读
更早的文章

Java 类加载之 ClassLoader

JVM 的组成部分 什么是 ClassLoaderJVM 组成部分 Class Loader: 作用: 加载编译后的 class 文件到内存 RunTime Data Area: JVM 内存模型 Execution Engine: 解析 class 文件中的字节码, 解析后提交到操作系统中执行 Native Interface: 本地接口,融合不同的编程语言的原生库为 Java 所用Q: JVM 如何加载 .class 文件A: JVM 由 4个部分组成,包括 ClassL...…

继续阅读