問題タブ [java-compiler-api]
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 - 名前空間はantビルドファイルでどのように機能しますか?
私は ant-contrib を使用しようとしていますが、ac: 名前空間を指定して使用される場合と使用されない場合があることに気付きました。
名前空間を使用する必要があるのはいつですか? その理由は?
java - JavaCompiler パッケージを使用して、別の Java クラス内で Java ソース ファイルをコンパイルした結果を取得する
クラス内に次の (単純化された) コードがあり、Java コンパイラを呼び出して特定のソース ファイルを処理します。
コンパイルは成功しましたが、MyClass.java の結果を取得する方法、このコンパイルされたコードを実行する方法を教えてください。
java - CompilationTask.call() は ClassNotFoundException を導入します。JDK7ではなくJDK6で動作
JDK6 から JDK7 に移行した後、次のコードがClassNotFoundExceptionで失敗する
回避策:
task.call() クラスへの呼び出し後、クラスがもう見つからない理由を知っている人はいますか? コンパイル タスクによって、システム クラスローダーが何らかの方法で変更されているように見えますか?
java - Java コンパイラ API でプリミティブ データ型に Trees.isAccessible() を使用する方法 / TypeMirror を DeclaredType に変換する方法
Java Compiler API を使用して .java ファイルを分析しようとしています。私の現在の問題は、特定の変数、メソッド、またはクラスがプログラム内の特定のスコープで認識されているかどうかを調べることです (スコープとは、Java コンパイラ API 自体で定義されているスコープを意味します。こちらを参照してください: http:// docs.oracle.com/javase/6/docs/jdk/api/javac/tree/com/sun/source/tree/Scope.html )。
Java コンパイラ API の Trees クラス ( http://docs.oracle.com/javase/6/docs/jdk/api/javac/tree/com/sun/source/util/Trees.html ) には、次のユーティリティ メソッドがあります。それをしてください:isAccessible。このメソッドは、Scope とターゲット ノード、およびその宣言された型を取得し、指定されたスコープでターゲット ノードが既知の場合は true を返します。
残念ながら、この DeclaredType オブジェクトを作成する方法はわかりません (スタックオーバーフローのスパム防止のため、今後はクラス名のみを記述し、ハイパーリンクを投稿することはできません: javax.lang.model.type.DeclaredType)。ターゲット Node にそのタイプ (javax.lang.model.element.Element [asType() メソッド]) を問い合わせることができますが、それは DeclaredType ではなく TypeMirror インスタンスを返します。
現在、次の 2 行のコードを使用しています。
ここで、「referenceCompTree」は現在のプログラムのツリー インスタンス、referenceScope は問題のスコープ、nodeElement は問題のノード、nodeType は問題のノードの DeclaredType である必要があります。
この直接型キャスト アプローチは、クラスのノードである 1 つのケースでうまく機能します (ノードが独自の型を宣言し、その typeMirror が独自の型と同等であるため、これが機能すると思います)。しかし、(ヘッダーに記載されているように) プリミティブ型の変数に対しては確実に機能しません。変数に対して機能するかどうかはわかりません。
誰か知っていますか
- プリミティブ型に Trees の isAccessible-method を使用する方法、またはより具体的には、TypeMirror インスタンスを DeclaredType インスタンスに一般的に変換する方法は? また
- isAccessibleを使用せずに必要な情報を取得する方法(変数、クラス、またはメソッドが特定のスコープで既知の場合)?
付録:
両方の質問についてさらに調査を行ったので、わかったことのいくつかを紹介したいと思います。
- タイプ (javax.lang.model.util.Types) と呼ばれるユーティリティ クラスがあります。型のインスタンスは、標準の Java コンパイラ API クラス (この場合は com.sun.source.util.JavaTask) を使用して取得できます。このオブジェクトには、指定された TypeElement といくつかの TypeMirror の DeclaredType インスタンスを返すメソッド (getDeclaredType) があります。しかし、この方法は、入力引数が少なかったことを示すエラーがスローされるため、私には機能しません。このメソッドには、指定された生のクラスといくつかの型パラメーターの DeclaredType インスタンスを返すという唯一の目的があると思います (たとえば、HashMap の DeclaredType インスタンスを作成するには、このメソッドを HashMap の typeElement と String の 2 つの typeMirrors と共に使用します)。明らかに、これは私が意図していることではありません。
- それぞれの修飾子を検索し、スコープ ツリーを検索して、変数、クラス、またはメソッドが特定のスコープで既知であるかどうかを手動で判断することで、回避策をプログラムしようとしましたが、主な理由が 2 つあります。検索アルゴリズムでJavaスコープ構築のすべての特殊なケースを正しく取得したかどうかはわかりません.2番目に、(一見)既に存在し、Javaコンパイラが常に行うものを再実装しようとするため、これは非常に不必要に思えます。地獄、私の NetBeans でさえ、特定の変数、メソッド、またはクラスが現在のスコープで既知であるかどうかを常に教えてくれます。ですから、何らかの方法があるはずです。
java - InvocationTargetException、この例外から原因となった例外をメッセージで抽出する方法
このステートメントを他の Java プログラムから実行する場合。
私はこの例外を得ました
SecurityException
JVMによって指定されたメッセージと行番号(強調表示されたテキストの上)で発生した例外のみを表示するだけです。
Web上でプログラムをコンパイルして実行するためのアプリケーションを開発しています。
ありがとうございました!!
java - メインクラスを検索またはロードできませんでした-異常な状況下
わかりました。これは非常に一般的で非常に単純な質問ですが、私の場合はかなり珍しい状況が発生します。(インターネット上の他の場所で解決策を見つけることができなかった状況。)それで、私はプログラムでコンパイルしているいくつかのソースコードを持っていますJavaCompiler
。次に、コンパイルされたコードをランタイムで実行しようとします。(つまり、Runtime.getRuntime().exec(String[])
。)ただし、上記のコードを実行しようとすると、次のようになりCould not find or load main class.
ます。問題のソースコードは次の基本モデルに従います。
そのコードでさえ実行されません。それでも同じエラーが発生します。よろしくお願いします。:)
*編集:私が詳細に行う手順は次のとおりです。
私はコードと呼ばれる文字列で上記のコードから始めます。次に、Fileオブジェクト(この場合はCompiled.java)を作成します。
私はテストしたカスタムメソッドを使用して、ファイルをコンパイルするために機能することを確認しました(オプションで、そこからClassオブジェクトを取得しますが、特定の理由により、この方法では実行できません)。 .classファイル。(
JavaCompiler
APIを使用します。)次に、それ
Runtime.getRuntime.exec(new String[]{"java",[location of .class file]});
を実行するために使用します。
この時点でエラーが発生します。
要求に応じて、私が使用している正確なコードはこれです。
3行目の文字列操作は少し面倒ですが、動作することを確認するためにトリプルチェックを行いました。のコードを確認したい場合。toClass()
ビット、ここに行きます。
java - 別のJavaコード内で文字列で使用可能なJavaコードをコンパイルする
重複の可能性:
Java 5 および Java 6 用のオンザフライのメモリ内 Java コード
コンパイル Java ファイル内のコードを使用した Java ファイルのコンパイル
以下の例に示すように、プログラムの文字列で使用できる hello world クラスがあります。
}
上記の例で利用可能なメモリ文字列でコードをコンパイルするのを手伝ってくれる人はいますか
javascript - クライアント側のWebページでサーバー側端末にアクセスする方法は?
端末エミュレーターは Web ページに埋め込む必要があり、ユーザーは Web ページ アクセスによってサーバー上に作成された Java プログラムをコンパイルして実行する必要があります。ターミナルでプログラムをコンパイルして実行したい。クライアントは、アプリケーション ソフトウェアをインストールする必要はありません。
java - javaのclass.forNameを介してロードされたクラスをクリアします
ユーザーが選択したJava(JPanel)ファイルをロードするプログラムを作成しました。ユーザーは基本的に、JavaCompilerによってコンパイルされ、次に生成されたクラスファイルがロードされるJavaファイルを選択します。しかし、何らかのテキスト エディタを使用して Java ファイル (JPanel) に変更を加えると、プログラムを閉じてプロジェクトを再実行しても、新しい変更がクラス ファイルに反映されないため、問題が発生します。
同じクラスファイルがメモリから何度もロードされていると思います。
ロードされたクラスをメモリからクリアする方法はありますか?
コンパイル:
読み込み中:
panel= (JPanel) cls.newInstance();
コンパイルされたクラス ファイルを逆コンパイラでチェックしたところ、コードが更新されましたが、以前のクラス ファイルがクラス ローダーによってメモリからロードされている理由がわかりません。
java - ソースコード操作による Java アノテーション処理
以下の要件の解決策を探していました-
- ソース ファイルは、メソッドにカスタム アノテーションを使用して書き込まれます。
- メソッド本体は、アノテーションに基づいて少し変更する必要があります。
- ソース ファイルは変更しないでください。ただし、コンパイラへの入力はソース ファイルを変更する必要があります。
以下のAPIを見てきました-
- javax.annotation.processing - 注釈処理。
- javax.lang.model.* - アノテーション処理とコンパイラ ツリー API で使用される言語モデル
- com.sun.source.* - コンパイラ ツリー API。
私は次のようにこれを設計することを考えました:
- 注釈プロセッサを作成する
- コンパイラ ツリーを生成する
- 元のソース ファイルに影響を与えることなく、実行時にコンパイラ ツリーを編集します。
- ツリーをコンパイラに提供する
コンパイラ ツリー API は、com.sun.source.tree.MethodTree へのアクセスを提供する場所で有望なようです。
ただし、コンパイラ ツリー API は読み取り専用のようです。手順 3 と 4 を達成する方法がわかりません
タスクを完了するために採用できるAPIはありますか
注: ソース コードの操作方法のみを探しています。実行時のバイトコード操作なし / AOP
環境: Java 6