home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

Java/ClassLoaderの分割 : kamranzafar/JCL

作成日: 2013-07-21 11:16:56   /   last updated at: 2013-07-21 11:40:58
カテゴリ: Java 

ClassLoaderを分割したい場合のメモ。

kamranzafar/JCL

Jarファイルをロードするカスタムクラスローダ。
https://github.com/kamranzafar/JCL

特色としては、単にクラスローダを分割するだけでなく、分割したクラスローダ間でのクラスキャストに対応していること。
Javaでは異なるクラスローダでロードされたClassは別物として扱われるため、以下の様なケースでは一般にClassCastExceptionが発生する。

  1. クラスローダAでHogeクラスをロード、インスタンスa生成
  2. クラスローダBでHogeクラスをロード、インスタンスb生成
  3. インスタンスa = インスタンスb で参照代入 -> 同じHogeクラスでもロードしたクラスローダが異なるためClassCastException

JCLでは、これを解決するために二種類の方式を提供している。

  1. (デフォルト)JDKのリフレクションAPIを使って、java.lang.reflect.ProxyによるProxyクラスで別クラスローダで生成したインスタンスをラップする。内部ではリフレクションを使ってインスタンスのメソッドを参照し、委譲する。
  2. cglibを使ったProxyクラスでラップする。内部ではリフレクションを使ってインスタンスのメソッドを参照し、委譲する。

詳しくはJCLのソースコード、"org.xeustechnologies.jcl.proxy"パッケージを参照。


original url: https://www.glamenv-septzen.net/view/1218