Javaのリフレクションを使って静的内部クラスをインスタンス化する方法
静的内部クラス(static nested class)は、外部クラスのインスタンスなしでもインスタンス化できるのが特徴です。一般的に内部クラスはネストクラス(nested class)の一種であり、Javaでは非静的ネストクラスと呼ばれます。内部クラスには主にメンバー内部クラス、匿名内部クラス、ローカル内部クラスの3種類があります。
リフレクションを使用して静的内部クラスをインスタンス化するには、InnerClass.class.newInstance() を利用します。一方、非静的内部クラスをインスタンス化する場合は外部クラスのインスタンスが必要となるため、new 演算子の前に外部クラスのインスタンスを指定する必要があります。
コード例
import java.lang.reflect.*;
public class InnerclassWithReflectionTest {
public static void main(String args[]) {
try {
InnerClass inner = (InnerClass) InnerClass.class.newInstance();
inner.test();
} catch(Exception e) {
e.printStackTrace();
}
}
// 静的内部クラス
static class InnerClass {
public void test() {
System.out.println("Welcome to TutorialsPoint !!!");
}
}
}
実行結果
Welcome to TutorialsPoint !!!
補足:Java 9以降での推奨される書き方
Class.newInstance() はJava 9以降で非推奨(deprecated)となっています。チェックされない例外をスローする問題があるため、現在は以下のように getDeclaredConstructor().newInstance() を使う方法が推奨されています。
InnerClass inner = InnerClass.class.getDeclaredConstructor().newInstance();
この方法であれば、コンストラクタがスローする例外を適切にハンドリングでき、より安全にリフレクションによるインスタンス生成を行えます。
-
Javaの匿名内部クラスでインターフェースを実装する方法をわかりやすく解説
匿名内部クラス(Anonymous Inner Class)とは、クラス名を持たないクラスのことであり、インスタンス化するその場で直接定義できるのが特徴です。インターフェースの実装を一時的に行いたい場合や、コードを簡潔にまとめたい場合に非常に便利な手法です。匿名内部クラスの基本通常、インターフェースを実装するには、別途クラスを定義して implements キーワードを使用します。しかし匿名内部クラスを使えば、new インターフェース名() { ... } の形式で、インスタンス生成と同時にメソッドの実装を記述できます。実装例次のプログラムでは、TutorialsPoint インターフェースの
-
Javaでサブパッケージを使う方法とは?コンパイルからインポートまで徹底解説
Javaのサブパッケージとは Javaにおけるサブパッケージは、ファイルシステム上のサブディレクトリとよく似た仕組みです。パッケージを階層的に整理することで、多数のクラスやインターフェースを効率よく管理できるようになります。 例として、com.apple.computers というパッケージに Dell.java というソースファイルが含まれている場合、そのファイルは次のような一連のサブディレクトリの中に配置されます。 ....\com\apple\computers\Dell.java コンパイル時の出力ファイルの仕組み コンパイルを実行すると、コンパイラはソースファイル内で定義されているク