問題タブ [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 は、メソッド変数から「this」オブジェクトを取得します

invokevirtual 操作を呼び出したオブジェクトの名前を知る必要があります (次の形式 - Objectname@object_id)。MethodInsnNode オブジェクトのみを指定することは可能ですか? インデックス0でローカル変数に格納されていることは知っていますが、取得方法がわかりません。

0 投票する
3 に答える
679 参照

java - Java バイトコード操作「invokevirtual」は、オブジェクトによって継承されたメソッドの一貫性を維持しません

次のコードがあります。

上記のコードでわかるように、Child は Object から toString() を継承し、Parent から hashCode() を継承します。Child#test のバイトコード操作は以下の通りです。

invokevirtual が Object.toString() を呼び出す場合、一貫性のために Parent.hashCode() を呼び出す必要があると思います。または、Child.hashCode() が呼び出された場合は、Child.toString() を呼び出す必要があります。

ただし、invokevirtual は、ターゲット メソッドが Object によって継承されている場合に限り、一貫性を維持しません。

その場合のみ、invokevirtual はオブジェクト内のメソッドを呼び出します。それ以外の場合は、invokevirtual が現在のクラスのメソッドを呼び出します。

なぜこれが起こるのか知りたいです。

0 投票する
2 に答える
432 参照

java - タイプがクラスローダーによって動的にロードされるオブジェクトの InvokeExact

私はこの問題に一日を費やしました。私の問題は、クラス型がプログラムの実行時に動的にロードされるインスタンスで MethodHandle.invokeExact 呼び出しを行う方法です。問題をより明確にするために、サンプルコードを以下に示します。

このサンプルでは、​​expClass が動的にロードされ、そのクラス タイプはAddSampleです。次の行の obj インスタンスは BaseTemplate であると宣言されており、その実際の型はAddSample. クラス AddSample は BaseTemplate のサブクラスです。次に、メソッドハンドル myMh を add 関数に作成しAddSampleますが、receiverType が一致しないため、myMH の呼び出しは失敗します。

myMH.invokeExact実行時エラーを発生させます

this のレシーバーはmyMHexpClass (AddSample) にあると宣言されてobjいますが、obj のクラスは AddSample ですが、現在提供されているレシーバーは BaseTemaplte と宣言されているためです。InvokeExact では、パラメーターが正確に一致する必要があります。


私の問題は次のように単純化される可能性があります:インスタンスをその基本型から動的にロードされる子型にキャストする方法は?

obj の宣言された型を、動的にロードされる AddSample に変更します..?

UPDATE:

キャストを使用しても、以前の結果と同じ問題を解決するのには役立ちません。その理由は、指定されたパラメーターが myMH 宣言と完全に一致していないためです。生成されたバイトコードを確認すると、より明確になります。

myMH は を指して (AddSample,String,int,float)intいますが、パラメーター: (Object, String, int, float)を指定すると、前に示した実行時エラーが発生します。

ありがとう

0 投票する
2 に答える
10742 参照

android - null オブジェクト参照で仮想メソッド '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 バイトコード命令を 1 つにしない理由はありますか?

非静的非コンストラクター メソッドを呼び出す命令を、1 つの統一された命令ではなく、2 つの異なる命令にする理由はありますinvokeinstanceか? ランダムな内部 JVM メカニズムと何か関係がありますか、それとも別の恐ろしいレガシー問題ですか?

コンストラクターの呼び出しにinvokespecialは名前の確認が必要であり、他のコンストラクターが実行されたことをマークするなどの理由があり、新しいスタックフレームにオブジェクトリファレンスをダンプする必要invokestaticがないためです。ただし、Sun がユニバーサル命令をandに分割することを選択した理由を簡単に見つけることはできません。分割しなければ、ASM コードははるかに単純になる可能性があります。これは、すべてのスーパーインターフェイスを調べて、これがインターフェイス メソッドであるかどうかを調べて、コードの複雑さを構築する必要がないためです。invokevirtualinvokeinterface

0 投票する
1 に答える
318 参照

java-bytecode-asm - # invokevirtual の後に行うこと

たとえば、int 変数 a と b がローカル変数 1 と 2 に格納されている場合、このコードは を計算しthis.f(3+b*a)ます。(this-pointer は変数 0 に格納されます)

#4ここに立っているのは何ですか?