スポンサーリンク
デバッグモードでない場合にだけ、動作確認用の遅いコードの実行(TestNGのAssert.assert...の引数部分の実行)を飛ばしたかったので調べてみました。
本当は、もちろんこんな方法のお世話にならないように作業するのがよいのだと思うのですが、気が付いたらこれが手っ取り早そうな状態になっていたので。
目次
- 1. 方法
- 2. 意味理解メモ
- 3. agentlib:jdwpって? -agentlib:jdwpで始まるオプションは、例えばこのようになっています。 -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:8000 これは、リモートデバッグ用のオプションであって、Eclipseがデバッグをする際に接続するポートその他の設定をしています。Eclipseがデバッグ実行時にこのオプションに追加する特徴を利用しているわけです。 このオプションについては、ヘルプに次ぎように紹介されています。 C:\Windows\System32>java -agentlib:jdwp=help Java Debugger JDWP Agent Library -------------------------------- (see http://java.sun.com/products/jpda for more information) jdwp usage: java -agentlib:jdwp=[help]|[<option>=<value>, ...] Option Name and Value Description Default --------------------- ----------- ------- suspend=y|n wait on startup? y transport=<name> transport spec none address=<listen/attach address> transport spec "" server=y|n listen for debugger? n launch=<command line> run debugger on event none onthrow=<exception name> debug on throw none onuncaught=y|n debug on any uncaught? n timeout=<timeout value> for listen/attach in milliseconds n mutf8=y|n output modified utf-8 n quiet=y|n JDK1.4では違うかも しかし、この「-agentlib:jdwp」を使えるのはJDK1.5以降であり、JDK1.4の場合は、「-Xdebug -Xrunjdwp:...」と指定するようです。なので、この判定方法はJDK1.4以前だと使えないと思われます。 RuntimeMXBeanで調べられる他のこと
スポンサーリンク
方法
Determine if a java application is in debug mode in Eclipse - Stack Overflow で紹介されている次の方法で、確かにデバッグモードかどうか(Debugで実行したか、Runで実行したか)を判定できました。
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean(). getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;
意味理解メモ
結論は上の通りなのですが、何をやっているのかの説明をしておきます。
java.lang.management.ManagementFactory.getRuntimeMXBean()
「java.lang.management.ManagementFactory.getRuntimeMXBean()」この部分で、RuntimeMXBeanインターフェースのオブジェクトを取得しています。このRuntimeMXBeanは、JVMを管理するためのインターフェースで、これを使って現在実行中のJVMの情報を取得することができます。
.getInputArguments():List<String>
そのいろいろ取得できる情報(あとで紹介)のうちで、JVMに渡されたパラメータを取得できるのがgetInputArgumentsメソッドです。
.toString()
しかし、それは起動時に渡されたパラメータそのものではなく、List<String>形式で返ってくるので、.toStringで、パラメータごとのただの文字列にしています(カンマ区切り)。
.indexOf("-agentlib:jdwp") > 0;
そして最後に、パラメータの中に「-agentlib:jdwp」というものがなかったかを調べています。パラメータが「-agentlib:jdwp」そのものならよいのですが、実際には「-agentlib:jdwp=...」と続くものなので、一度List<String>をStringにしてから探す、という操作をしているのだと思われます。
agentlib:jdwpって?
-agentlib:jdwpで始まるオプションは、例えばこのようになっています。
-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:8000
これは、リモートデバッグ用のオプションであって、Eclipseがデバッグをする際に接続するポートその他の設定をしています。Eclipseがデバッグ実行時にこのオプションに追加する特徴を利用しているわけです。
このオプションについては、ヘルプに次ぎように紹介されています。
C:\Windows\System32>java -agentlib:jdwp=help
Java Debugger JDWP Agent Library
--------------------------------
(see http://java.sun.com/products/jpda for more information)
jdwp usage: java -agentlib:jdwp=[help]|[<option>=<value>, ...]
Option Name and Value Description Default
--------------------- ----------- -------
suspend=y|n wait on startup? y
transport=<name> transport spec none
address=<listen/attach address> transport spec ""
server=y|n listen for debugger? n
launch=<command line> run debugger on event none
onthrow=<exception name> debug on throw none
onuncaught=y|n debug on any uncaught? n
timeout=<timeout value> for listen/attach in milliseconds n
mutf8=y|n output modified utf-8 n
quiet=y|n
JDK1.4では違うかも
しかし、この「-agentlib:jdwp」を使えるのはJDK1.5以降であり、JDK1.4の場合は、「-Xdebug -Xrunjdwp:...」と指定するようです。なので、この判定方法はJDK1.4以前だと使えないと思われます。
RuntimeMXBeanで調べられる他のこと
RuntimeMXBeanを使うと、オプション以外にも、次のようなものが調べられそうです(詳しくは:RuntimeMXBean (Java Platform SE 7 ))。
- getClassPath:クラスパスを取得
- getUptime:アップタイムを取得
- getStartTime:起動時刻を取得
- getSystemProperties:システムプロパティを取得
- getVmVersion:JVMのバージョンを取得
- ...
スポンサーリンク
RuntimeMXBeanを使うと、オプション以外にも、次のようなものが調べられそうです(詳しくは:RuntimeMXBean (Java Platform SE 7 ))。
- getClassPath:クラスパスを取得
- getUptime:アップタイムを取得
- getStartTime:起動時刻を取得
- getSystemProperties:システムプロパティを取得
- getVmVersion:JVMのバージョンを取得
- ...
スポンサーリンク
スポンサーリンク