newInstanceメソッド(形式2)
説明
パラメタtypeの表すクラスのインスタンスをExplicitメモリブロックに直接生成します。パラメタargsに指定した値がインスタンスを生成するコンストラクタの引数として渡されます。パラメタで指定したクラスのインスタンスのコンストラクタなどによる初期化で生成されるオブジェクトについては,Javaヒープに生成します。
形式
public Object newInstance(Class type, Object... args);
パラメタ
- type:
-
直接生成する配列インスタンスのクラスです。
- args:
-
コンストラクタに渡すパラメタです。
例外
- NullPointerException:
-
パラメタtypeまたはパラメタargsの値のどちらかまたは両方がnullです。
- SecurityException:
-
SecurityManagerがあり,かつ次のうちどれかに当てはまる場合にスローされます。
-
s.checkMemberAccess(type,Member.PUBLIC)の呼び出しがこのコンストラクタへのアクセスを許可しない場合
-
呼び出し側のクラスローダが異なる場合
-
現在のクラスローダの上位クラスローダとs.checkPackageAccess()の呼び出しがこのクラスのパッケージへのアクセスを許可しない場合
-
- NoSuchMethodException:
-
パラメタargsの要素と同じ型のパラメタを持つpublicコンストラクタがパラメタtypeの表すクラスにありません。
- ExceptionInInitializerError:
-
パラメタtypeまたはパラメタtypeが表すクラスの初期化に失敗しました。
- InstantiationException:
-
パラメタtypeまたはパラメタtypeが表すクラスが抽象クラスまたはインタフェースです。
- InvocationTargetException:
-
パラメタtypeまたはパラメタtypeが表すクラスのコンストラクタの実行で例外が発生しました。
- InaccessibleMemoryAreaException:
-
サポートされていない機能です。
- IllegalAccessException:
-
ConstructorオブジェクトがJava言語アクセス制御を実施するため,基本となるコンストラクタにアクセスできません。
- IllegalArgumentException:
-
次のどれかに当てはまる場合にスローされます。
-
実パラメタ数と仮パラメタ数が異なる場合
-
プリミティブ引数のラップ解除変換が失敗した場合
-
プリミティブ引数のラップ解除後,パラメタ値を対応する仮パラメタ型に変換できない場合
-
コンストラクタが列挙型に関連している場合
-
戻り値
このオブジェクトが表すExplicitメモリブロックに生成されたインスタンスへの参照を返却します。
共通エラーチェックをして,処理できないと判定した場合,type.getConstructor(arg_types※)として,java.lang.reflect.Constructorインスタンスを取得します。この場合,java.lang.reflect.Constructorをレシーバ,パラメタargsをパラメタとして,java.lang.reflect.Constructor.newInstance(Object... initargs)のメソッドを呼び出し,その結果を返却します。共通エラーチェックについては,「10.6 Explicitメモリブロックを制御する処理のエラーチェック(共通エラーチェック)」を参照してください。
- 注※
-
arg_typesは,パラメタargsの各要素をこのオブジェクトとしてObject.getClass()を呼び出した結果を要素とするClass配列です。
注意事項
パラメタtypeには,publicクラスを与えることを推奨します。
プリミティブ型を引数とするコンストラクタを呼び出すことはでききません。プリミティブ型を引数とするコンストラクタを呼び出す場合は,newInstanceメソッド(形式3)を使用します。次にnewInstanceメソッド(形式3)を使用したコード例を示します。
import JP.co.Hitachi.soft.jvm.MemoryArea.*; import java.lang.reflect.*; public class test1 { public static void main(String[] args) throws Exception { ExplicitMemory em = new BasicExplicitMemory(); TheClass obj = null; Constructor cons = TheClass.class.getConstructor(new Class[]{int.class}); obj = (TheClass)em.newInstance(cons,1); // 実行成功 obj = (TheClass)em.newInstance(TheClass.class,1); // NoSuchMethodExceptionをスロー } } public class TheClass { public TheClass(int i){} }