标签: invokevirtual

Java字节码操作'invokevirtual'不保持Object继承的方法的一致性

我有以下代码.

public class Parent {

    @Override
    public int hashCode() {
         return 0;
    }

}

public class Child extends Parent {

    public void test() {
        this.toString();
        this.hashCode();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

ALOAD 0: this
INVOKEVIRTUAL Object.toString() : String
ALOAD 0: this
INVOKEVIRTUAL Child.hashCode() : int
RETURN
Run Code Online (Sandbox Code Playgroud)

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

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

只有这种情况,在Object中调用虚拟调用方法.对于其他情况,请在当前类中调用虚拟调用方法.

我想知道为什么会这样.

java jvm bytecode invokevirtual

5
推荐指数
2
解决办法
604
查看次数

#invokevirtual之后做什么

例如,如果将int变量a和b存储在局部变量1和2中,则此代码将进行计算this.f(3+b*a)。(此指针存储在变量0中)

iload_1
aload_0
icons_3
iload_1
iload_1
imul
iadd
invokevirtual #4
Run Code Online (Sandbox Code Playgroud)

#4站在这里代表什么?

java-bytecode-asm invokevirtual

3
推荐指数
1
解决办法
197
查看次数

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

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

public class Welcome extends Activity {

String userName;
final EditText editText=(EditText)findViewById(R.id.editText);
final TextView textView=(TextView)findViewById(R.id.textView);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.welcome);
    final TextView textView=(TextView)findViewById(R.id.textView);
    final EditText editText=(EditText)findViewById(R.id.editText);
    userName=editText.getText().toString();


    textView.setText(String.format("Welcome, %s.", userName));
}
}
Run Code Online (Sandbox Code Playgroud)

logcat 基本上是标题,以下行出错:

userName=editText.getText().toString();
Run Code Online (Sandbox Code Playgroud)

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

我的 MainActivity.java 是

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.view.View;

public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); …
Run Code Online (Sandbox Code Playgroud)

android nullpointerexception android-activity invokevirtual

0
推荐指数
1
解决办法
9993
查看次数