问题标签 [invokevirtual]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
929 浏览

java - Java asm get "this" object from method variables

I need to know the name of the object which called invokevirtual operation(in the following format - Objectname@object_id). Is it possible given only MethodInsnNode object? I know that it is stored with the index 0 in local variables but I don't know how to get it.

0 投票
3 回答
679 浏览

java - Java 字节码操作“invokevirtual”不保持 Object 继承的方法的一致性

我有以下代码。

正如您在上面的代码中看到的,Child 从 Object 继承 toString(),从 Parent 继承 hashCode()。Child#test 的字节码操作如下。

我认为如果invokevirtual 调用Object.toString(),它应该调用Parent.hashCode() 以保持一致性。或者,调用 Child.hashCode(),然后调用 Child.toString()。

但是,当且仅当目标方法被 Object 继承时,invokevirtual 才保持其一致性。

只有在这种情况下,invokevirtual 才会调用 Object 中的方法。对于其他情况,invokevirtual 调用当前类中的方法。

我想知道为什么会这样。

0 投票
2 回答
432 浏览

java - 对象上的 InvokeExact,其类型由类加载器动态加载

我花了一整天的时间来解决这个问题。我的问题是如何对实例进行 MethodHandle.invokeExact 调用,该实例的类类型在程序运行时动态加载。为了使问题更清楚,我在下面显示我的示例代码:

在这个示例中,expClass 是动态加载的,它的类类型是AddSample. 下一行中的 obj 实例被声明为 BaseTemplate,其真实类型为AddSample. AddSample 类是 BaseTemplate 的子类。然后一个 MethodHandle myMh 被创建到 add 函数,AddSample但 myMH 的调用失败,因为 receiverType 不匹配。

引发myMH.invokeExact运行时错误

因为 this 的接收者myMH被声明为在 expClass (AddSample) 上,但是obj当前提供的接收者被声明为 BaseTemaplte,尽管 obj 的 Class 是 AddSample。InvokeExact 需要精确的参数匹配。


我的问题可能会简化为:如何将实例从其基本类型转换为动态加载的子类型?

将obj的声明类型更改为动态加载的AddSample..?

UPDATE:

使用 cast 无助于解决与先前结果相同的问题。原因仍然是给定的参数与 myMH 声明不完全匹配。当我检查生成的字节码时会更清楚:

myMH 指向 (AddSample,String,int,float)int,但给定参数: (Object, String, int, float),这会导致我之前显示的运行时错误。

谢谢

0 投票
2 回答
10742 浏览

android - 尝试在空对象引用上调用虚拟方法 'android.view.View android.view.Window.findViewById(int)'

基本上,这个应用程序应该询问您的姓名,并带有保存选项,单击时会弹出一个警报对话框并询问“您确定吗?”,单击“是”时,它应该说“欢迎+任何名称” . 我的问题是该应用程序在表示欢迎之前一直关闭。我将字符串声明为 userName 并在没有任何函数的情况下运行它,它只是说“欢迎,null”。但是当我做了 userName=editText.getText().toString(); 该应用程序立即关闭。请帮助我没有想法。调用欢迎页面的页面工作正常,但welcome.java 是有问题的文件。

logcat 基本上就是标题,给下面一行报错:

PS我已经在onCreate之前和之后移动了那行代码,它仍然给出了错误

我的 MainActivity.java 是

}

我的 activity_main.xml 是

我的welcome.xml 是

我的 userpreferences.java

}

和我的用户 preferences.xml 文件

0 投票
1 回答
515 浏览

java - 是否有任何理由不将invokevirtual 和invokeinterface 字节码指令合二为一?

是否有任何理由将调用非静态非构造方法的指令变成两条不同的指令而不是一条统一的指令,比如invokeinstance?它是否与一些随机的内部 JVM 机制有关,或者它是另一个可怕的遗留问题?

我知道我们有invokespecial,因为调用构造函数需要名称检查,标记另一个构造函数已执行等,并且invokestatic因为我们不需要将objectref转储到新的堆栈帧中。invokevirtual但是,Sun 选择将可能的通用指令拆分到and中并没有一个容易找到的理由invokeinterface。如果不拆分它,ASM 代码可能会简单得多,因为我们不必查看所有超级接口来查看这是否是接口方法,从而构建代码复杂性。

0 投票
2 回答
298 浏览

java - Java final 方法使用静态绑定,但 JVM 在编译时使用“invokevirtual”指令

很多书都说java final实例方法(非私有)使用静态绑定,其他实例方法(非私有)使用动态绑定。然而,在编译时,它们都使用“invokevirtual”JVM 指令。当JVM执行“invokevirtual”指令时,是否区分最终方法和非最终方法?我最初认为 final 方法使用“invokespecial”作为私有实例方法,因为它们都使用静态绑定。

0 投票
1 回答
318 浏览

java-bytecode-asm - what does # do after invokevirtual

For example if int-variables a and b are stored in local variables 1 and 2, this code would compute this.f(3+b*a). (this-pointer is stored in variable 0)

for what does #4 stand here ?

0 投票
2 回答
79 浏览

jvm - 当通过invokevirtual 调用方法时,JVM 如何知道要弹出多少值到新帧中?

当通过invokevirtual 调用方法时,调用方法会弹出要与objectref 一起传递给被调用方法的值,并将它们放入新的堆栈帧中。

它如何知道哪个堆栈条目是 objectref?我的猜测是,它是通过查看被调用方法的类型并对其进行解析以确定要弹出多少值来实现的,但这似乎效率极低。还有其他一些我忽略的机制吗?