1

*.jar ファイルがあり、そこからいくつかのクラスを使用したいと考えています。とりわけ、パッケージ「com.aa」のクラス「a」と、クラス「a」のパッケージ「com.aaaae」が含まれています。「com.aaaaea」としてクラスにアクセスしようとすると、エラーが発生します: com.aaaa は型に解決できません。これは、コンパイラがパッケージ「com.aaaa」ではなく、クラス「com.aaa」のフィールド「a」を取得しようとするために発生します。このクラスもインポートしようとしましたが、違いはなく、「インポート com.aaaa を解決できません」というエラーが表示されます。

クラス「com.aaaaea」を使用する方法はありますか? *.jar 内のクラスの名前を変更できるツールはありますか? それとも、リフレクションがここで役立つのでしょうか?

4

3 に答える 3

3

使用しようとしている JAR は難読化されている可能性が高く、これはおそらく、実行しようとしていることを防ぐためです。一部の Java 難読化ツールは、パッケージ、クラス、メソッド、および変数名を変更して JLS に違反していますが、有効なコンパイル済みバイトコードのままです。これはまさにこの JAR に対して行われたことのようです。その場合、逆コンパイルされたコードを理解することは非常に困難になります。

難読化された JAR は通常、コードで使用できるように公開 API のみを難読化されたままにします。他のすべては、逆コンパイルしたり、直接使用したりできないようにスクランブルされます。

于 2012-11-05T15:41:39.993 に答える
2

JLS からの引用:

単純な名前は、変数、型、またはパッケージの名前として解釈される可能性があるコンテキストで発生する可能性があります。このような状況では、§6.5 の規則は、変数が型より優先して選択され、型がパッケージより優先して選択されることを指定します。したがって、可視型またはパッケージ宣言を単純な名前で参照できない場合があります。そのような宣言は隠されていると言います。

リフレクションは、問題を回避するのに役立ちます。クラスの名前を変更することもほとんどの状況で解決策になる可能性がありますが、行儀の良いjarにはこの問題さえありません。あなたの jar は難読化プロセスを経ているのではないかと思います。難読化の方法によっては、クラスの名前変更が複雑になる可能性があります。

于 2012-11-05T13:51:26.470 に答える
0

Java Code Conventions - http://www.oracle.com/technetwork/java/codeconv-138413.html - を使用すると、このようなエラーは発生しません。

jar にアクセスする場合は、逆コンパイルし、修正してからアセンブルします。

于 2012-11-05T13:48:03.523 に答える