java字节码操作和java反射api?

nwlqm0z1  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(342)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

四年前关门了。
改进这个问题
我最近遇到了“字节码操作”这个术语(研究这个问题的原因是,在看到使用hibernate的应用程序中的日志时,碰巧看到了字节码提供程序)。我还了解(一点)java反射api。
这两个概念相似吗?它们之间有什么区别?什么时候用哪个?

v6ylcynt

v6ylcynt1#

反射api允许您访问有关已加载到jvm的类的成员(字段、方法、接口、e.t.c.)的信息。这个api不允许修改类的行为,除了一些基本的东西,比如调用私有方法。
反射api适用的一些示例
依赖注入框架可以将依赖项设置为所有者对象的私有字段。
可以使用反射为类生成equals/hashcode/tostring方法,而不必枚举所有字段,并且在添加新字段或删除现有字段时修改这些方法
再次使用relfection api将类序列化为json/xml/yaml或任何其他格式,而不必枚举所有字段
相反,字节码操作允许您对磁盘上的某些.class文件或已使用java代理api加载到jvm的类进行任何更改
字节码操作适用的几个示例:
来自java标准库的代理只支持代理接口;字节码操作也允许您在类方法周围添加建议
单元测试的模拟框架允许替换私有静态方法的返回值—它是使用字节码操作实现的
探查器用时间记录代码 Package 每个方法
下面是它的样子

private void foo() {
    long start = System.currentTimeMillis(); // inserted by bytecode manipulation
    Profiler.enterMethod("foo"); // inserted by bytecode manipulation
    try { // inserted by bytecode manipulation
        //  original method code
    } finally { // inserted by bytecode manipulation
        Profiler.exitMethod("foo", System.currentTimeMillis() - start); // inserted by bytecode manipulation
    } // inserted by bytecode manipulation
}

相关问题