問題タブ [java-bytecode-asm]
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 - JavaASMヘルプが必要
次のクラスをコンパイルして生成されるバイトコードを生成するJavaASMを使用して簡単なプログラムを作成します。
このクラスのバイトコードを生成するために私が書いたコードを以下に示します。
これは正常にコンパイルされ、実行しようとすると、次のエラーが発生します。
このエラーを回避するために誰かが私を助けてくれますか?誰かがエラーの原因とそれを回避する方法を説明できるなら、私を助けるのに十分親切にしてください。
ありがとうございました。
ファローアップ:
java Mainのように実行すると、次のエラーが発生します。
java - プロジェクト パッケージ外のクラスで asm (Java バイトコード) クラスリーダーを使用していますか?
クラスのパスを入力して取得しています (「C:\Temp\Test.class」としましょう)。私がしたいのは、ClassReader をこのクラスに初期化し、ClassAdapter と ClassWriter を使用して計測を開始することです ( iインストルメンテーションの方法を知っている)。
私が知らないのは、そのクラスをクラスリーダーに「フェクト」する方法です。
コンストラクタ ClassReader(String) を使ってみましたがだめでした
ありがとう !(そして私の悪い英語でごめんなさい)
java - Javaのプリミティブ型のハッシュコード/ヒープアドレスはありますか?
私はヒープで対処するためのいくつかの近似を見つけようとしていました、そしてあなたたちは私に関数を与えましたSystem.IdentityHashCode(Object)
。
問題は、この関数がプリミティブ型に適合しないことです。その理由を説明します。
私は入力Javaコンパイル済みプログラム-クラスファイルとして与えられます。私の目標は、時間間の可変アクセスに関する情報を含むいくつかのグラフをプロットすることです。コードがどのように見えるかを前もって知りません。私の戦術は、すべてのLOADおよびSTORE命令に対して自分のバイトコードをインストルメント化することです。ASM JavaBytecodeInstrumentationを使用しています。
したがって、私は次のようなことはできません。
タイプがint、double、longなどであるかどうかがわからないためです。
同じクラスの異なるインスタンスを判別できるようにしたい:
例えば :
しかし、バイトコードに関しては、名前「b」/「c」と属性aの間に関係はありません。私が「見る」のは、aがインクリメントされることだけです。どちらも!と見なされます もしそうなら、Object a
System.identityHashCode()を使用してそれらを区別することができたはずです。しかし、私はできません。
明確にするために、次の例を見てください。
これは(主な機能)次のバイトコードに変換されます:
ご覧のとおり、スタックにあるのは整数cの値だけです。したがって、そのコードを考えると、これら2つのcのどちらかを判断することはできません。
java - 「Hello, World!」の生成 Java ASM ライブラリを使用したクラス
現在取り組んでいるコンパイラ プロジェクトの ASM API をいじり始めました。しかし、ドキュメンテーションは多くの場所で新参者にとって明確ではないことがわかっており、単純に「Hello, World!」を出力するクラスを生成する良い確かな例があると思いました. ここにあるのは素晴らしい例です。
現在、(ClassWriter、ClassVisitor、および MethodVisitor クラスを使用して) main() を使用してクラスを生成できますが、メインの本体を生成する方法がわかりません。ASM でクラス ファイルを生成する例を教えてください。
- main() を含む
- 「Hello, World!」という値を持つローカル文字列変数を main() に作成します。
- 変数を出力します
java - アノテーションが存在する場合、変換されたクラスにインターフェースを追加する
ClassAdapter
asm フレームワークを使用してバイトコード トランスフォーマーを作成しています。クラスにカスタム アノテーションが存在する場合は、いくつかのメソッドを追加して、クラスにインターフェイスを実装させたいと考えています。メソッドの追加は正常に機能していますが、クラスにインターフェイスを実装させる最善の方法は何だろうと思っています。visitAnnotation
は の後にしか呼び出されないためvisit
、どうにかして super visit メソッドの呼び出しを遅らせ、それまで必要なすべての情報をバッファリングする必要があります。
誰かが似たようなものを実装しましたか? パッケージのドキュメントでは可能であれば回避することを推奨していますが、これには asm のツリー API を使用する必要がありますか?
変換の一般的な構造は次のとおりです。
java - バイトコードクラスメソッド、javaを呼び出す
私はJavaを初めて使用し(私は.NET、Lua ...でプログラミングするために使用します)、ASMを使い始めました。したがって、クラス「Foo」のメソッドを使用できません。これらのメソッドを呼び出すにはどうすればよいですか?
どうもありがとう...
コード:
*新しいコードの動作*
PaŭloEbermannに感謝します。次のステップでは、インスタンスを使用してクラスの読み込みを試みます( "Class s = new simple()"のようなものだと思います)。
java - リフレクション以外で JavaBean を設定する方法
とにかくJavaBeanにデータを入力できるかどうか知っていますが、リフレクションを使用したくありません。
たとえば、このxmlテンプレートを使用して入力します
サンプル XML ファイル
Java Bean で setCard を呼び出したいのですが、リフレクションを以前に使用したことがあり、非常に遅いため、リフレクションは使用したくありません。
代替手段はありますか?たとえば、Hibernateはどのようにそれを行いますか?
ありがとうカルロ
java - 定数プールの javap の出力を理解する
非常に単純な HelloWorld アプリケーションで javap を実行すると、定数プールに関する出力に混乱が生じます。
テストコード
Javap -c -verbose 出力 (省略)
3 行目で、#22 を介して "hello world" 定数がスタックにプッシュされていますが、const #23 は実際の値を保持しているようです。プリントアウトの右側に表示される #(数字) が何を意味するのか、少し混乱していると思います。
Javap に関する Oracle/Sun の man ページには、まだ十分とは言えない点がたくさんあります。
java - Asm バイトコード クエリ
こんにちは、ASM バイトコード Tree Api を使用して、クラスの静的分析を実行しようとしています。かなり基本的な質問があると思います。foobar() というメソッドでは、foobar 内に命令のリストがあります (リストを持つ InsnList)。ここで、命令番号 10 で関数 "barfoo(String args)" が呼び出されているかどうかを確認したいと思います。
また、個別に、特定の命令が条件付きかどうかを確認する必要があります。
ありがとう、SJ
注: すでにクラスを読み取って、関心のある特定のメソッドに到達し、そのメソッドの各命令を反復処理できます。
解決済み (グレッグのコメントを参照):
java - 変数の定義と割り当てはasmバイトコードを検出します
Javaコードの静的分析にASMバイトコードツリーAPIを使用しようとしています。私はClassNodecn、MethodNode mを持っており、そのメソッドの命令のリストはInsnListlistと言っています。
与えられた命令(つまりAbstractInsnNode)について、上記の命令リストのsにある変数のすべての定義/割り当てを見つける必要があるとします。より明確にするために、変数varが2行目で定義および初期化され、8行目で他の値が割り当てられ、12行目で使用されているとします。この場合、12行目が私のです。また、その間の行に多くの条件付きコードがあると想定します。
これはASMで可能ですか?どのように??
よろしく、SJ
明確にするために、
ここで、条件付きがJumpInsnNode(現在の命令)であり、条件内の変数(この場合はv.rankとnumIter)のいずれかが上記のコードのどこかで変更または割り当てられているかどうか(およびどこで)を見つける必要があるとします。単純にしてください。メンバー変数だけです(静的関数や別のクラスの関数への委任はありません)。