問題タブ [jvm-bytecode]
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.
java - ASM は 'Type.INT_TYPE' を定数 Bootstrap メソッド引数として渡すことができません
invokedynamic
ASM を使用して命令を生成するための次のコードを考えてみましょう。
生成されたクラスをASMifierで逆コンパイルすると該当行が
ご覧のとおり、Type.INT_TYPE
は という名前の参照型へのリテラル参照に変わりましたI
。これが存在しないため、JVM は実行時にjava.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: I
.
私が代わりにやりたかったのは、 int.class
(Class
プリミティブ型のインスタンスint
、またはInteger.TYPE
定数の値)bootstrap
の引数としてメソッドに渡すことでしたsomeClass
。ただし、ASM はこれを適切に理解またはサポートしていないようです。
これは ASM のバグと見なすことができますか? また、回避策はありますか?
java - Unsafe.defineClass を使用して実行時に複数のクラスを定義する
私は、私のカスタム プログラミング言語の REPL に取り組んでいます。Class<?>
これは、入力のバイトコードを生成し、メソッドを使用してインスタンスに変換するために使用するコンパイラの上に実装されますsun.misc.Unsafe.defineClass(String, byte[], int, int, ClassLoader, ProtectionDomain)
。関連するコードは次のようになります (例外処理などの無関係な部分は省略されています)。
入力で複数のクラスをコンパイルしてロードする必要があるとします。
compilables
リストにはコンテンツがあります
クラスは(匿名) クラスとrepl.Result_0$A
クラスに依存し、バイトコードでそれらの名前を参照します。を使用して定義すると、次のエラーが発生します。repl.Result_0$A$0
repl.Result_0$B
Unsafe
リストを並べ替えて最初に定義することでこれを解決できることはわかってrepl.Result_0$A$B
いますが、参照もある可能性があるため、それは一般的な解決策ではありませんB -> A
。
Unsafe.defineClass
未解決のクラスの検証エラーを引き起こすことなく、複数のクラスを定義してロードする方法はありますか?
java - asm java での作業時に検証エラーが発生する
System.out.println("hey");
基本的に、メソッドの最後に単純なものを追加しようとしています。ツリー API を使用しました。ただし、このエラーが発生し続けます。
java.lang.VerifyError: ブランチ ターゲット 38 でスタックマップ フレームが必要です
これは私のコードです:
そして、これは私のクラスノードです:
そして、これがコードを「注入」する方法です(jarから直接ロードするため、zipFileを使用しています)
そして、私がそれを実行するたびに言ったように、検証エラーが発生します。それを解決する方法や、そのコードを「注入」するためのよりスマートな方法はありますか?
java - How to create a dynamic proxy using ByteBuddy
In Java it is possible to create dynamic proxies using an implementation of InvocationHandler
. Despite JVM optimizations, using reflection will always have some overhead invoking a method.
To try to solve this problem, I tried to use ByteBuddy to create the proxy classes at runtime, but the documentation didn't seem clear enough on this aspect.
How do I create a MethodCallProxy
in order to forward a method invocation to some class instance?
Edit:
To better clarify my problem, I am providing an example of what I want to achieve:
I am building an RPC system. On each side of a method invocation, I have an interface defining the contract (when both caller/callee are running under the JVM).
At the call site, I inject a proxy that intercepts all method calls and forwards them to the callee.
And, finally, at the callee, I have several handlers, one for each service method, responsible for unmarshalling the invocation parameters and forwarding them to the service implementation.
I could solve this problem using code generation, but the resulting jar
file can become very big. Thus, I want to create a generic version of these handlers and, in each instance, attach a proxy that intercepts every method call to ISomeService
and forwards them to SomeServiceImpl
.
java - Unsed ローカル変数 Java 8 - java.lang.VerifyError: Inconsistent stackmap frame
最近、プロジェクトを 1.7 から Java 1.8 にアップグレードしました。
クラスの 1 つでメソッドの一貫性のないスタックマップの例外が発生します。
メソッドで割り当てられていないローカル変数を初期化することで解決しましたが、Java 8 で未読変数を使用すると例外が発生する理由を説明してください。
使用している eclipse バージョン (Kepler SR 2 20140224-0627) に関連している可能性があります。
回避策
障害のあるコードを修正する前に、以前は「--xxSplitVerifier」(1.7) または「-noVerify」Jvm 引数を使用していました。
Eclipseワークスペースのコンパイラ設定が「未使用のローカル変数を保持する」オプションでチェックされていない場合、Java 8で正常にコンパイルされます
方法:
私が一緒にいる会社の非常に大きくて抑制されたコードとして、完全な方法を投稿することはできません。
スタックフレーム:
原因: java.lang.VerifyError: ブランチ ターゲット 2079 で一貫性のないスタックマップ フレーム
例外の詳細: 場所: someClass.setData(someClass/Data)I @2079: iload_3
理由: タイプ top (現在のフレーム、locals[4])は'java/lang/StringBuffer' (スタック マップ、locals[4]) に 割り当てられません。
現在のフレーム: bci: @98 flags: { } locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, top, top } stack: { 'someClass/Data' }
Stackmap Frame: bci: @2079 flags: { } locals: { 'someClass/setData', 'someClass/Data', 'someClass/Data', integer, 'java/lang/StringBuffer', 'java/lang/String' }スタック:{}