据我所知,一切都是Java中的一个对象。
我正在浏览java JDK并正在尝试创建一个允许我执行更多调试操作的自定义JDK。例如,我可以通过更改Object.java类来操作每个对象。
我的问题是:方法是否也从JRE继承了一个类,所以我可以将这个父类修改为例如。创建一个方法保存它最近传递的参数?
感谢。
答案 0 :(得分:5)
不,Java中的所有内容都不是对象。方法不是对象,原始值不是对象,引用不是对象。只有对象是Java(和数组)中的对象。
有些对象代表类(java.lang.Class
),方法(java.lang.reflect.Method
),构造函数(java.lang.reflect.Constructor
)和字段(java.lang.reflect.Field
) 。但“代表”某事与“存在”某事并不是一回事。
所以不:方法不是对象,它们不从任何基类(或“基本方法”)继承。
如果您希望以较低级别与JVM进行交互,那么JVM TI可能是适合您的API。
答案 1 :(得分:3)
如果您只想加强调试,可以先查看JVMTI提供的内容。甚至在此之前,看看JDI是否在JVMTI之上构建的更高级别(因此更易于使用)的API适合您的需求。
虽然你所说的内容本身听起来不太可能,instrumentation可以使用字节码操作库(如BCEL)来实现类似的效果。
至于您的具体示例,如果您想记录方法调用及其参数,只需使用JDI设置断点然后查询调用堆栈即可。
答案 2 :(得分:1)
字段,方法,参数,局部变量不是Java中的对象。它们具有可以使用反射来表示它们的对象,但它们不是对象。
如果要更改方法的行为以跟踪传递给它的参数,可以使用代码注入。例如AspectJ做到了这一点,并举例说明了如何做到这一点。