Java
先日発生した不具合を調べるために、jconsoleでJWSアプリケーションに接続しようとしたのだが、これまた上手く接続できるケースと接続できないケースが発生することが解った。 jconsoleが接続できるケース コマンドラインからJWSアプリケーションを起動する…
最新はUpdate 6(1.6.0_06)のはずなのだが、日本語のリリースノートを見ると堂々と1.6.0_07が最新と書いてある。(IE7だと相変わらずUTF-8のエンコードに失敗する) Java SE 6 Update 7 リリースノートそんなバージョン、どこで公開されているんだ?追記: >そん…
ここで何度かネタにしてきたJavassistのProxyFactoryだが、同クラスを使ったことがあるプログラマはClassLoaderProviderインタフェースのスタティックなフィールドが公開されていることに気がついただろうか。 公開されているProxyFactory.classLoaderProvid…
Java6 Java Web Start(以降JWSに略)アプリケーション内でAttach APIを使うと表題のエラーが発生することが判明した。以前にも日記で紹介したと思うが、JMX MXBeanのローカルコネクタアドレスを取得するメソッドにて、 public static String getJMXLocalConne…
JavassistやCGLIB等のバイトコードエンハンサは既存の型をオンザフライで拡張するのだが、java.reflect.Proxy等とは違い、拡張した後は通常のClass型であり、名前以外は通常の型と全く同じである。 では、エンハンサで拡張された型を判定する方法は無いのだ…
今まで何話かバイトコードエンハンサに関してのネタを書いて来たが、その総括として、Swingアプリケーションに限らずよく例として挙げられる、JavaBeansのPropertyChangeSupportによるプロパティ値の変更通知を自動化してみよう。1. PropertyChangeSupportク…
cglibにしろJavassistにしろオンザフライで拡張した型を際限無く生成していれば、あっという間にリソースの上限を超えてしまう。普通、生成したクラスの情報はPerm領域に積まれるが、この領域は拡張されていないことが多いためにOutofMemoryを起こしてしまう…
Javassistやcglibでクラスをエンハンスする場合、元の型をスーパータイプとして指定するので、拡張される前の型情報は引継がれるはずだが、アノテーションに関してはそうではないので注意が必要だ。以下のようなアノテーションを公開しているとしよう。 @Doc…
既に書いたが、Javassist、cglibは共にバイトコードを出力/書き換えることにより、既存の型を動的に拡張した型を生成することができるが、この機能を利用するために提供されるプロキシ(エンハンサ)は、捕捉するメソッドをフィルタリングすることが可能だ。 …
Swingアプリケーション用のバイトコードエンハンサに何を使うかの検討だが、結論としてはデフォルトにJavassistを使い、場合によってはcglibも使えるようにシステムプロパティの値によってエンハンサ(を利用したAOP用プロキシの実装)を選べるようにした。※1J…
Java1.3以降はDynamicProxyというメッセージ(メソッド)捕捉の仕組みを持つが、.NETのRealProxy等とは違い、インタフェースがメッセージ捕捉対象の絶対条件となるため、JavaBeansのPropertyChangeSupportの自動化等、インタフェースが実装されているとは限ら…
以前に同様のメソッドをスタックトレースから取得する実装にしていたのだが、現在のスレッドのコンテキストによっては当然のごとく期待通りの値を返さない。 public static String getMainClassName() { StackTraceElement[] traces = Thread.currentThread(…
タグライブラリィ(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…
Windows Vistaの標準的なテキストボックスは、このスクリーンショットの様に淵が少しだけ面取りされて描画され、フォーカスの有無によって背景色を変える効果が追加されているのだが(スクリーンショットでは、背景をグレーにして判り易いようにしている)、Ja…
組込みのクラスを使う方法と、URLを扱うことのできる外部プロセス(コマンド)を起動する方法がある。 組込みのクラスを使う Java組込みのクラスを使うことでOSに依らずにURLを開くことができる(大抵はWebブラウザか、そのプラグインを使うことになる)1. Java6…
以下のコードでできるはずだと思ったのだが、上手くいかない Registry registry = LocateRegistry.getRegistry("localhost", Registry.REGISTRY_PORT); UnicastRemoteObject.unexportObject(registry, true); 実行結果 java.rmi.NoSuchObjectException: obje…
いい加減、JavaとRubyの直接比較は止めた方が良いのではないだろうか。 双方ともに現時点での用途と良さがあるのだし、言語としての性格もかなり違うので直接比べるのは難しいと思うのは私だけだろうか。特に、生産性に関しては短期と長期、ソフトウェアのラ…
現在起動されている全てのVMのJMXローカルコネクタアドレスを取得する処理を、汎用的に使うために簡単な関数にした。 static final String CONNECTOR_ADDRESS = "com.sun.management.jmxremote.localConnectorAddress"; public static String[] getJMXLocalC…
昨日のエントリから。 なお、上記では取得したMXBeanをインタフェースに直接キャストしているが、実際にはMBeanServerConnection#isInstanceOfメソッドを使って、現在接続しているMXBeanの型を前もってチェックすることで、InstanceNotFoundExceptionを捕捉…
Java6より、インタフェースとアノテーションによってMXBeanは非常に簡単に作れるようになった。 例えば私が実際に作っている「コードベース及びソケットのリスンポートを返すMXBean」は、以下のようにインタフェースにMXBeanアノテーションを付加することで…
MBeanは発表当初は実装の面倒さや、管理/監視目的のために用意された、どちらかというとニッチ向けのテクノロジとして紹介された為、サーバベンダー以外、いまひとつ積極的に使うユーザいなかったようだが、Java5->Java6とバージョンを重ねる度にクライアン…
以前に書いたアタッチAPIよりも詳細な情報にアクセスしたい場合にはsun.jvmstat.monitorパッケージを使う方法もある。(というか、恥ずかしながら最近知った) MonitoredHost host = MonitoredHost.getMonitoredHost("localhost"); for (Object lvmid : host.a…
複数のJVMで公開されているプラットフォームMXBean等のJMXBeanは、当然同一の名前を持っている訳で、その場合同一ホスト上の複数のJVM毎に公開されているはずのMXBeanに接続するにはどうすれば良いのか解らなかったのだが、ちゃんとドキュメントに書いてあっ…
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を取得する など、他のアプリケーションの情報を調べるための方法が必要になってくる。 いろいろ試して考…
先日紹介した「任意のJava Web Start(以降 JWS)アプリケーションが起動されているかを調べる」だが、上手くいかないケースがあることが判明した。 エントリで書いたように、アプリケーション中から javaws.exe JNLPをダウンロードするURL と起動したケースで…
Unmatched braces in the pattern. Babelのエラーだが、本日Eclipse上から全てのアップデートを取込んだら直っていた。これで完璧かな。
先日、問題が無くなったと書いたBabel(Eclipse Babel Project)だが、型をポイントしてソースコード(又は逆アセンブル結果)にジャンプしようとすると、表題の例外が発生することが判った。 java.lang.IllegalArgumentException: Unmatched braces in the patt…