0

すべてのパッケージ階層をフラット化したい場合、どうすれば続行できますか?また、落とし穴は何ですか?

この質問は、なぜ私がこれをやりたいのかではなく、どのように行うのかについてであることに注意してください。たとえば、有効な理由には、Proguardを有用なプログラムにするいくつかの理由が含まれます(ただし、これらに限定されません)。

最初はクラス名をそのままにしておきたいのですが、すべての階層を削除します。

それで:

  • com.acme.example.SomeClassは、「SomeClass」または
    「a.SomeClass」のいずれかになります。
  • com.acme.sample.AnotherClass
    は、 「AnotherClass」または「a.AnotherClass」のいずれかになります。

簡単なチェックを行いましたが、約1,000のクラスのうち、名前が重複しているクラスは2つありません。

find . -iname "*java" | sed 's/.*\///g' | sort | wc -l

と:

find . -iname "*java" | sed 's/.*\///g' | sort | uniq | wc -l

どちらも同じ数の.javaファイルを提供します(したがって、*。javaファイルに「重複した名前」がないことは間違いありません)。

私は次のようなシェルスクリプトを書くことを考えていました。

  • パッケージ行を削除(または変更)する
  • すべての「importcom.acme....」行を削除します

これは機能しますか?

これが機能しない原因は何でしょうか?パブリック/保護/デフォルト/プライベートの可視性の観点から何が起こりますか?

ここでは反射が大混乱を引き起こすと思いますが、ありがたいことに私たちは何もしていません。

自分のクラスでのみ実行したいことに注意してください。外部API/jarを変更したくありません。

4

1 に答える 1

2

proguardを見てください。これは、パッケージのフラット化や、必要に応じて他のものを難読化しないなど、多数のオプションを備えたコード難読化ツールです。

于 2012-10-13T17:44:47.940 に答える