
Javaで条件分岐などによってコード自体を削除することはできるのでしょうか。
目的はデバッグコードの負荷軽減です。
C言語でいうところの、プリプロセッサのようなことができることが理想です。
例えば、メソッド中に以下のようなコードがあるとします。
------------------------------------
final boolean DEBUG = true;
if (DEBUG) System.out.println("Debug: hogehoge");
------------------------------------
上の場合はif文条件分岐の処理負荷が発生すると思います。
この程度であれば低負荷であることは認識していますが、どうも気持ちが悪いです。
例えば、C言語であれば以下のようにしてコンパイル時にコードごと削除することができると思います。
-------------------------------------
#define DEBUG
int main(){
#ifdef DEBUG
printf("Debug: hogehoge");
#endif
return 0;
}
-------------------------------------
Javaで上記のようなことを実現することは可能でしょうか。
デバッグコードの削除が目的ですので、仮にこれができなかったとしてもIDEやそのプラグインなどで目的が達せられれば問題ありません。
どなたか解決策をご存知であればご教示願います。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
「java プリプロセッサ」で検索すれば、Java用に作られた
プリプロセッサがいくつか見つかります。
(参考)
http://mfsocket.blogspot.com/2011/08/001java.html
また、Cコンパイラにjavaソースをプリプロセッサ処理させる
という手もあります。
(参考)
http://www.symmetric.co.jp/blog/archives/21
ただ、上記参考URLにも書かれている通り、
こういったプリプロセッサ処理をやるとeclipseとの連携が
難しくなります。
http://blawat2015.no-ip.com/~mieki256/diary/2006 …
に書かれていますが、あまりシビアでなければ
コンパイラの最適化に期待した方が幸せかもしれません。
少なくともif文の条件式が定数値の場合の最適化くらいは
してくれると思います。
No.1
- 回答日時:
こうしたものは、JavaではAOPを利用するのが一般的だろうと思います。
AOPというのは、多くのクラスで特定の地点で要求される処理を「横断的関心事(アスペクト)」として扱い、指定されたクラスに一斉に処理を外部から挿入したり取り除いたりする機能です。AspectJというライブラリがそのための機能を提供します。が、Spring AOPを利用したほうがアノテーションでポイントカットを簡単に挿入できるので、私はもっぱらSpring利用です。AspectJやSpring AOPなどで検索してみてください。
AOPの場合、コードを挿入する位置はポイントカットと呼ばれる地点に限られており、だいたいメソッドの呼び出し前と呼び出し後という感じなので、細々とコード内に埋め込んでいくわけにはいきません。このへんが少し不自由な感じがするかも知れません。が、デバッグコードだけでなく、例えばテスト関連などでも用いられますし、データベースなどのダミーデータ挿入などいろいろ応用が効くので、覚えておいて損はないと思いますよ。
回答ありがとうございます!
Spring AOPなるものについて調べてみました。
確かに任意の箇所にコードを挿入するのは難しいようですが、きちんとモジュール化されているものであれば、十分に役割を果たせそうです。
存在を知らなかったので、大変勉強になりました。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロのコードを、少しでも削って短くしたい 3 2022/08/30 07:46
- その他(プログラミング・Web制作) EXCEL VBAについて 2 2022/12/04 17:03
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 3つの条件を指定してVBAで行を削除したい 条件1:分類1が重複 条件2:分類2が重複 条件3:個数 6 2022/06/24 11:07
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C#の2つの実行ファイルとアプリアイコンの変更について 1 2023/01/07 16:57
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) VBA 行削除した連番 4 2023/06/27 16:00
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Androidアプリで本体の音量変更...
-
javaのプログラムが止まる
-
戻り値のないメソッド
-
乱数について
-
今日は こどもの日 で、良い天...
-
僕の出身中学校は200人同級生が...
-
C++で*thisは何を指しているの...
-
初心者なのですが、
-
unicodeファイルの読み込み
-
C#で背景色の設定 (0xFFC0DBなど)
-
SQLです教えてくださいお願いし...
-
恋愛
-
VBA 400エラー 1004エラー
-
マルチプルインスタンスのメリット
-
中学生です。 私は教室の黒板に...
-
drawStringで文字間隔の調整
-
インスタンス参照でアクセスで...
-
TextFieldの文字の折り返し
-
どこからも呼ばれていない無意...
-
EXCEL VBAにて動的にCheckBOXを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Java] while(true)の意味
-
tryの終了
-
Javaでのデバッグコード削除
-
Javaアプリケーション実行の返...
-
Javaプログラムからポップアッ...
-
onBlurとonFocusの処理順序につ...
-
Tomcat高負荷時の設定について
-
数値の定数を付ける時
-
アコーディオンメニューをアン...
-
ラジオボタンの選択判定
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
C#で別スレッドの終了を知りたい
-
素数判定を再帰処理で
-
JavaScriptからJAVAクラスを呼...
-
switch文の中に、throws new Ex...
-
PHPでDB処理中にプログレスバー...
-
C#の処理をリアルタイムに表示...
-
Windowsサービスの処理
-
ftp 同時複数接続の負荷テスト...
おすすめ情報