关闭。这个问题需要更加突出重点。它目前不接受答案。**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
四年前关门了。改进这个问题我最近遇到了“字节码操作”这个术语(研究这个问题的原因是,在看到使用hibernate的应用程序中的日志时,碰巧看到了字节码提供程序)。我还了解(一点)java反射api。这两个概念相似吗?它们之间有什么区别?什么时候用哪个?
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 }
1条答案
按热度按时间v6ylcynt1#
反射api允许您访问有关已加载到jvm的类的成员(字段、方法、接口、e.t.c.)的信息。这个api不允许修改类的行为,除了一些基本的东西,比如调用私有方法。
反射api适用的一些示例
依赖注入框架可以将依赖项设置为所有者对象的私有字段。
可以使用反射为类生成equals/hashcode/tostring方法,而不必枚举所有字段,并且在添加新字段或删除现有字段时修改这些方法
再次使用relfection api将类序列化为json/xml/yaml或任何其他格式,而不必枚举所有字段
相反,字节码操作允许您对磁盘上的某些.class文件或已使用java代理api加载到jvm的类进行任何更改
字节码操作适用的几个示例:
来自java标准库的代理只支持代理接口;字节码操作也允许您在类方法周围添加建议
单元测试的模拟框架允许替换私有静态方法的返回值—它是使用字节码操作实现的
探查器用时间记录代码 Package 每个方法
下面是它的样子