|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Objectcom.docomostar.lang.ByteArrayClassLoader
public final class ByteArrayClassLoader
バイト配列変数に格納された Jar 形式のバイト列から動的にクラスをロードしてクラスオブジェクトを生成する手段を提供します。
CLDC にはクラスローダが存在しないため、 クラスパスに新たなパスを追加する手段を提供することで、 動的なクラスのロードを実現しています。 そのため、以下の制約があります。
ByteArrayClassLoader
インスタンスを生成することはできません。
このクラスでは、クラスパス設定機能が提供されています。
実際にクラスを利用するには、クラスパスを設定した後に
Class.forName(String)
を呼び出してクラスをロードしてください。
[Star-1.5 (2011年春以降発売モデル) まで]
このクラスでは importJar(byte[], int, int)
によるクラスパス設定機能のみが提供されています。
[Star-2.0 以降]
loadJar(byte[], int, int)
および unloadJar(int)
が追加されています。
loadJar(byte[], int, int) によって Jar 形式のバイト列をヒープ上で確保した領域へコピーしクラスパスを追加するだけでなく、
unloadJar(int) によって追加されたクラスパスを削除し、ヒープ上の Jar 形式のバイト列を解放することができます。
これにより、動的にロードしたクラスをアンロードし、同名の別クラスを新しくロードし直すことができます。
ただし、新旧クラスを同時にロードおよび使用することはできません。
importJar(byte[], int, int) と loadJar(byte[], int, int) でバイナリデータとして同一の
Jar 形式のバイト列を追加した場合、それらは別のクラスパスとして追加されます。
パーミッションとしてクラスローダ機能の利用が許可されているトラステッド Star アプリだけがこのクラスローダを使用可能です。
ロードしたクラスはそのクラスのインタフェース、もしくはスーパークラスを通して使用してください。
以下にクラスのロードを行う使用例の一つとしてインタフェースを用いる場合を示します。
// ロードするクラスが実装すべきインタフェースの定義; アプリのJarに含めます
public interface LoadableInterface {
void draw();
}
// ロードするクラスの実装; loadJar()/importJar()に渡すバイト配列変数に格納します
public class SomeLoadableClass implements LoadableInterface {
public void draw() {
...
}
}
// クラスパス追加およびクラスロード処理; アプリの実装コードです
int id;
Class c;
LoadableInterface li;
ByteArrayClassLoader bacl = ByteArrayClassLoader.getInstance();
try {
id = bacl.loadJar(b, offset, length); // Star-1.5 (2011年春以降発売モデル) までは importJar() を使用します
c = Class.forName("SomeLoadableClass");
LoadableInterface li = (LoadableInterface)c.newInstance();
li.draw();
}
catch (Throwable t) {
}
[Star-2.0 以降]
ロードしたクラスのクラス型変数やロードしたインタフェースのインタフェース型変数を通してインスタンスが使用された場合、
unloadJar(int)
を呼び出してもロードしたクラスをアンロードすることはできず、例外が発生します。
メソッドの概要 | |
---|---|
static ByteArrayClassLoader |
getInstance()
このクラスローダインスタンスを返します。 |
void |
importJar(byte[] b,
int offset,
int length)
推奨されていません。 Star-2.0 以降では、 このメソッドは推奨されません。 代わりに、 loadJar(byte[], int, int) を使用して下さい。 |
int |
loadJar(byte[] b,
int offset,
int length)
Jar 形式のバイト列をバイト配列変数からヒープ上で新規に確保された領域へコピーし、 classpath にコピー先のバイト列の場所を追加して、その classpath を示す ID を返します。 |
void |
unloadJar(int id)
loadJar(byte[], int, int) で追加した classpath を削除し、
ヒープ上に確保した Jar 形式のバイト列を解放します。 |
クラス Object から継承されたメソッド |
---|
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
メソッドの詳細 |
---|
public static ByteArrayClassLoader getInstance()
このクラスローダインスタンスを返します。 常に同一のインスタンスを返します。
パーミッションとしてクラスローダ機能の利用が許可されていない場合には、 このメソッドを呼び出した時点でセキュリティ違反として Star アプリが強制終了されます。
public void importJar(byte[] b, int offset, int length) throws JarFormatException
loadJar(byte[], int, int)
を使用して下さい。
Jar 形式のバイト列をバイト配列変数からヒープ上で新規に確保された領域へコピーし、 classpath にコピー先のバイト列の場所を追加します。
このメソッドで追加された classpath は個別に ID で管理されないため、追加した classpath を示す ID を取得することはできず、
unloadJar(int)
を用いて classpath を削除することもできません。
ただし、それ以外は loadJar(byte[], int, int)
と同様に振る舞います。
b
- コピー元のバイト配列変数を指定します。offset
- コピー元のバイト配列変数のコピー開始位置を指定します。length
- コピーするバイト列の長さを指定します。
NullPointerException
-
IndexOutOfBoundsException
-
JarFormatException
-
public int loadJar(byte[] b, int offset, int length) throws JarFormatException
Jar 形式のバイト列をバイト配列変数からヒープ上で新規に確保された領域へコピーし、
classpath にコピー先のバイト列の場所を追加して、その classpath を示す ID を返します。
追加した classpath は、unloadJar(int)
を使用して削除することができます。
まだ一度もこのメソッドを呼び出していない状態では、 classpath には、システムクラス群や、 この Star アプリを構成するクラス群の場所のみが設定されています。
このメソッドは以下の処理を順次行います。
このメソッドの実行後にコピー元のバイト配列変数の値を変更した場合でも、
Class.forName(String)
によってロードされるクラスの内容は影響を受けません。
このメソッドが複数回実行された場合は、
その都度、新規領域の確保、
バイト列の新規領域へのコピー、および
classpath への場所の追加が行われます。
ただし、既に classpath に追加済みの
Jar 形式のバイト列を指定してこのメソッドが実行された場合は、
新規領域の確保などは行われず、初めて追加した時と同一の ID を返します。
Class.forName(String)
によるクラスロード時には、classpath の先頭から順に、
ロード対象クラスが検索されます。
コピー対象範囲のバイト列が Jar 形式に違反している場合には、
このメソッド実行時または
Class.forName(String)
実行時に例外が発生します。
b
- コピー元のバイト配列変数を指定します。offset
- コピー元のバイト配列変数のコピー開始位置を指定します。length
- コピーするバイト列の長さを指定します。
NullPointerException
-
IndexOutOfBoundsException
-
JarFormatException
-
public void unloadJar(int id)
loadJar(byte[], int, int)
で追加した classpath を削除し、
ヒープ上に確保した Jar 形式のバイト列を解放します。
さらにその classpath からロードしていたクラスをアンロードします。
loadJar(byte[], int, int) で追加した classpath のみが削除可能です。
importJar(byte[], int, int)
で追加した classpath は削除できません。
削除する classpath からロードしていたクラスは、以下の条件のうち 1 つでも該当する場合はアンロードすることができません。 そのようなクラスが 1 つでもあった場合、classpath は使用中と判断され、このメソッドは例外を発生します。
ロードしていたクラスの static メソッドまたは static フィールド(ロードしていたインタフェースの static フィールドも含む)に一度でもアクセスした場合や、 ロードしていたクラスのクラス型変数やロードしていたインタフェースのインタフェース型変数を通してインスタンスを使用した場合は、 classpath はアプリが終了するまで使用中と判断され、このメソッドは例外を発生します。
失敗した場合は ID は有効な状態のままであり、classpath およびロードされたクラスは実行前と変わりありません。
既に削除済みの classpath を示す ID などの無効な ID を指定された場合は、例外が発生します。
classpath の削除と追加を組み合わせることで、同一のクラス名を持ちながら実装の異なるクラスをロードすることができます。 ただし、それらのクラスを同時にロードおよび使用することはできません。
id
- 削除する classpath を示す ID を指定します。IllegalArgumentException
-
IllegalStateException
-
|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
NTT DOCOMO,INC.
本製品または文書は著作権法により保護されており、その使用、複製、再頒布および逆コンパイルを制限するライセンスのもとにおいて頒布されます。NTTドコモ(その他に許諾者がある場合は当該許諾者も含めて)の書面による事前の許可なく、本製品および関連する文書のいかなる部分も、いかなる方法によっても複製することが禁じられます。フォントを含む第三者のソフトウェアは、著作権法により保護されており、その提供者からライセンスを受けているものです。
Sun、Sun Microsystems、Java、J2MEおよびJ2SEは、米国およびその他の国における米国 Sun Microsystems,Inc.の商標または登録商標です。サンのロゴマークは、米国 Sun Microsystems, Inc.の登録商標です。
FeliCaは、ソニー株式会社が開発した非接触ICカードの技術方式です。FeliCaは、ソニー株式会社の登録商標です。
「iモード」、「iアプリ/アイアプリ」、「i-αppli」ロゴ、「DoJa」はNTTドコモの商標または登録商標です。
その他記載された会社名、製品名などは該当する各社の商標または登録商標です。