すべてのパッケージ階層をフラット化したい場合、どうすれば続行できますか?また、落とし穴は何ですか?
この質問は、なぜ私がこれをやりたいのかではなく、どのように行うのかについてであることに注意してください。たとえば、有効な理由には、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を変更したくありません。