12

JAVAでは「ネイティブ」が特別なものであることを知っていました。それは多くのことを行うことができます。しかし、私は今それを読むことができません。どうすればいいのかわからない... JAVAで他の数学を呼び出すことができることはわかっていました。私の質問は: プライベート メソッドを呼び出すことができますか? YES の場合、同じクラスまたは他のクラスのみですか? 他人を呼べるなら危ないかも、という問題か。つまり、ルール違反です。NATIVE についての詳細はどこで入手できますか? 誰か私にリンクを見せてもらえますか?

4

2 に答える 2

32

JNIプログラマーズガイドおよび仕様では、「10.9アクセス制御ルールへの違反」で次のように述べています。

「JNIは、privateやfinalなどの修飾子を使用してJavaプログラミング言語レベルで表現できるクラス、フィールド、およびメソッドのアクセス制御制限を適用しません。ネイティブコードを記述して、のフィールドにアクセスまたは変更することができます。ネイティブコードがヒープ内の任意のメモリ位置にアクセスして変更できることを考えると、IllegalAccessExceptionJNIの許容度は、意識的な設計上の決定でした。」

したがって、あなたの質問に対する答えは次のとおりです。

プライベートメソッドを呼び出すことはできますか?

はい。

それがYESの場合、同じクラスまたは他のクラスでのみですか?

任意のクラス。

それが他の人を呼ぶことができるならば、それは多分それが危険であるという問題ですか?つまり、それは規則を破った。

通常のJavaアクセスルールを適用しようとしない設計者の論理的根拠は、上記のテキストに明確に示されています。はい、それは潜在的に危険ですが、JNIの使用は潜在的に危険です

于 2012-08-31T03:47:18.637 に答える
5

JNI インターフェースを介してネイティブ メソッドに渡された Java オブジェクトのプライベート メソッドを呼び出すことができます。これは、Java 内で他の Java オブジェクトのメソッドを呼び出すことと同じではありません。JNI は、 や などの修飾子を使用して表現されるクラス、フィールド、およびメソッドのアクセス制御制限を強制しないため、十分に注意する必要ありprivateますfinal。したがって、危険な場合があります。たとえば、ネイティブ コードはfinal、JIT コンパイラがインライン化した後、クラスの定数フィールドを変更できます。

関数とポインターに関する JNI ドキュメントの関連セクションは次のとおりです

于 2012-08-31T03:26:43.397 に答える