Java

jconsoleによるJava web startアプリへのアタッチ

先日発生した不具合を調べるために、jconsoleでJWSアプリケーションに接続しようとしたのだが、これまた上手く接続できるケースと接続できないケースが発生することが解った。 jconsoleが接続できるケース コマンドラインからJWSアプリケーションを起動する…

Java SE 6 Update 7?

最新はUpdate 6(1.6.0_06)のはずなのだが、日本語のリリースノートを見ると堂々と1.6.0_07が最新と書いてある。(IE7だと相変わらずUTF-8のエンコードに失敗する) Java SE 6 Update 7 リリースノートそんなバージョン、どこで公開されているんだ?追記: >そん…

ProxyFactoryに見るスタティックな処理のオーバライド

ここで何度かネタにしてきたJavassistのProxyFactoryだが、同クラスを使ったことがあるプログラマはClassLoaderProviderインタフェースのスタティックなフィールドが公開されていることに気がついただろうか。 公開されているProxyFactory.classLoaderProvid…

"UnsatisfiedLinkError: no attach in java.library.path" in Java Web Start

Java6 Java Web Start(以降JWSに略)アプリケーション内でAttach APIを使うと表題のエラーが発生することが判明した。以前にも日記で紹介したと思うが、JMX MXBeanのローカルコネクタアドレスを取得するメソッドにて、 public static String getJMXLocalConne…

エンハンスされた型の認識

JavassistやCGLIB等のバイトコードエンハンサは既存の型をオンザフライで拡張するのだが、java.reflect.Proxy等とは違い、拡張した後は通常のClass型であり、名前以外は通常の型と全く同じである。 では、エンハンサで拡張された型を判定する方法は無いのだ…

エンハンサによるPropertyChangeSupportの自動化

今まで何話かバイトコードエンハンサに関してのネタを書いて来たが、その総括として、Swingアプリケーションに限らずよく例として挙げられる、JavaBeansのPropertyChangeSupportによるプロパティ値の変更通知を自動化してみよう。1. PropertyChangeSupportク…

Javassist、ProxyFactoryのキャッシュ戦略

cglibにしろJavassistにしろオンザフライで拡張した型を際限無く生成していれば、あっという間にリソースの上限を超えてしまう。普通、生成したクラスの情報はPerm領域に積まれるが、この領域は拡張されていないことが多いためにOutofMemoryを起こしてしまう…

エンハンスされた型のメソッドとアノテーション

Javassistやcglibでクラスをエンハンスする場合、元の型をスーパータイプとして指定するので、拡張される前の型情報は引継がれるはずだが、アノテーションに関してはそうではないので注意が必要だ。以下のようなアノテーションを公開しているとしよう。 @Doc…

Javassistとcglibにおけるメソッドフィルタの指定

既に書いたが、Javassist、cglibは共にバイトコードを出力/書き換えることにより、既存の型を動的に拡張した型を生成することができるが、この機能を利用するために提供されるプロキシ(エンハンサ)は、捕捉するメソッドをフィルタリングすることが可能だ。 …

Javassist or cglib

Swingアプリケーション用のバイトコードエンハンサに何を使うかの検討だが、結論としてはデフォルトにJavassistを使い、場合によってはcglibも使えるようにシステムプロパティの値によってエンハンサ(を利用したAOP用プロキシの実装)を選べるようにした。※1J…

Swingアプリにおけるバイトコードエンハンサ

Java1.3以降はDynamicProxyというメッセージ(メソッド)捕捉の仕組みを持つが、.NETのRealProxy等とは違い、インタフェースがメッセージ捕捉対象の絶対条件となるため、JavaBeansのPropertyChangeSupportの自動化等、インタフェースが実装されているとは限ら…

JVMが起動されたメインクラス名を取得する

以前に同様のメソッドをスタックトレースから取得する実装にしていたのだが、現在のスレッドのコンテキストによっては当然のごとく期待通りの値を返さない。 public static String getMainClassName() { StackTraceElement[] traces = Thread.currentThread(…

JSTL(標準タグライブラリ)で嵌る

タグライブラリィ(Taglib)のプレフィクスを解決するためのURIは、対応するTLDにおけるtaglib要素内のuri要素と同じものを書く必要がある。旧版(JSTL1.0) <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>新版(JSTL1.1) <%@ taglib prefix="c" …

習慣の生き物

私はJavaでオブザーバを実装する場合、Observable/Observerではなくイベントリスナを使う。 イベントリスナのパターンを既存のクラスに追加するには1. イベントリスナ・インタフェースを作成 public interface IHogeListener extends EventListener { void h…

VistaのボーダーとLookAndFeel

Windows Vistaの標準的なテキストボックスは、このスクリーンショットの様に淵が少しだけ面取りされて描画され、フォーカスの有無によって背景色を変える効果が追加されているのだが(スクリーンショットでは、背景をグレーにして判り易いようにしている)、Ja…

JavaでURLを開く

組込みのクラスを使う方法と、URLを扱うことのできる外部プロセス(コマンド)を起動する方法がある。 組込みのクラスを使う Java組込みのクラスを使うことでOSに依らずにURLを開くことができる(大抵はWebブラウザか、そのプラグインを使うことになる)1. Java6…

RMIローカルレジストリをシャットダウンする

以下のコードでできるはずだと思ったのだが、上手くいかない Registry registry = LocateRegistry.getRegistry("localhost", Registry.REGISTRY_PORT); UnicastRemoteObject.unexportObject(registry, true); 実行結果 java.rmi.NoSuchObjectException: obje…

恣意的な生産性

いい加減、JavaとRubyの直接比較は止めた方が良いのではないだろうか。 双方ともに現時点での用途と良さがあるのだし、言語としての性格もかなり違うので直接比べるのは難しいと思うのは私だけだろうか。特に、生産性に関しては短期と長期、ソフトウェアのラ…

JMXのローカルコネクタアドレスを取得する

現在起動されている全てのVMのJMXローカルコネクタアドレスを取得する処理を、汎用的に使うために簡単な関数にした。 static final String CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress"; public static String[] getJMXLocalC…

ダウト

昨日のエントリから。 なお、上記では取得したMXBeanをインタフェースに直接キャストしているが、実際にはMBeanServerConnection#isInstanceOfメソッドを使って、現在接続しているMXBeanの型を前もってチェックすることで、InstanceNotFoundExceptionを捕捉…

プラットホームMBeanサーバと独自MXBean

Java6より、インタフェースとアノテーションによってMXBeanは非常に簡単に作れるようになった。 例えば私が実際に作っている「コードベース及びソケットのリスンポートを返すMXBean」は、以下のようにインタフェースにMXBeanアノテーションを付加することで…

どんどん使おうMXBean

MBeanは発表当初は実装の面倒さや、管理/監視目的のために用意された、どちらかというとニッチ向けのテクノロジとして紹介された為、サーバベンダー以外、いまひとつ積極的に使うユーザいなかったようだが、Java5->Java6とバージョンを重ねる度にクライアン…

起動プロセス中のJVM情報を列挙する

以前に書いたアタッチAPIよりも詳細な情報にアクセスしたい場合にはsun.jvmstat.monitorパッケージを使う方法もある。(というか、恥ずかしながら最近知った) MonitoredHost host = MonitoredHost.getMonitoredHost("localhost"); for (Object lvmid : host.a…

JVM毎に公開されるJMXローカルコネクタアドレスを取得する

複数のJVMで公開されているプラットフォームMXBean等のJMXBeanは、当然同一の名前を持っている訳で、その場合同一ホスト上の複数のJVM毎に公開されているはずのMXBeanに接続するにはどうすれば良いのか解らなかったのだが、ちゃんとドキュメントに書いてあっ…

AgentLoadException

com.sun.tools.attach.AgentLoadException: Agent JAR not found or no Agent-Class attribute at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:99) パスにjarを配置しているにも関わらず例外。中々うまくいかんな。

インストゥルメンテーションエージェントを起動時にロードする

java.lang.instrument (Java Platform SE 6)アプリケーション起動時のオプションに"javaagent:"オプションを指定することで、エージェントのjarアーカイブからエージェントクラスをロードできる(この例の場合、hogeagent.jar中のマニフェスト中に書かれたエ…

起動済みのアプリケーションのコードベースを取得する

jnlpとコードベース RMIなどで起動されたURLを公開、共有する 起動されたコードベースを取得するエージェントを用意し、アタッチAPI経由で注入してURLを取得する など、他のアプリケーションの情報を調べるための方法が必要になってくる。 いろいろ試して考…

jnlpとコードベース

先日紹介した「任意のJava Web Start(以降 JWS)アプリケーションが起動されているかを調べる」だが、上手くいかないケースがあることが判明した。 エントリで書いたように、アプリケーション中から javaws.exe JNLPをダウンロードするURL と起動したケースで…

Eclipse Babel Project (その3)

Unmatched braces in the pattern. Babelのエラーだが、本日Eclipse上から全てのアップデートを取込んだら直っていた。これで完璧かな。

Unmatched braces in the pattern.

先日、問題が無くなったと書いたBabel(Eclipse Babel Project)だが、型をポイントしてソースコード(又は逆アセンブル結果)にジャンプしようとすると、表題の例外が発生することが判った。 java.lang.IllegalArgumentException: Unmatched braces in the patt…