単一のClass
引数を受け取るコンストラクターを使用して、String
オブジェクトからオブジェクトをインスタンス化したいです。
ここに私が望むものに近づくいくつかのコードがあります:
Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();
ただし、テキストなしでJLabel
オブジェクトをインスタンス化します。文字列を初期テキストとして受け入れるJLabel
コンストラクターを使用したいと思います。 Class
オブジェクトから特定のコンストラクターを選択する方法はありますか?
Class.newInstance
は、引数のないコンストラクター(パラメーターを受け取らないコンストラクター)を呼び出します。別のコンストラクターを呼び出すには、リフレクションパッケージ(Java.lang.reflect
)。
次のようなConstructor
インスタンスを取得します。
Class<?> cl = Class.forName("javax.swing.JLabel");
Constructor<?> cons = cl.getConstructor(String.class);
getConstructor
の呼び出しは、単一のString
パラメーターを取るコンストラクターが必要であることを指定します。インスタンスを作成するには:
Object o = cons.newInstance("JLabel");
これで完了です。
追伸最後の手段としてのみリフレクションを使用してください!
次はあなたのために働くでしょう。これを試して、
Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel");
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
Class.forName("className").newInstance()
は常に引数なしのデフォルトコンストラクターを呼び出します。
引数なしの引数なしのコンストラクタではなく、パラメータ化されたコンストラクタを呼び出すには、
Constructor
のgetDeclaredConstructor
メソッドにClass[]
で型を渡すことで、Class
をパラメーター型で取得する必要がありますObject[]
に値を渡すことでコンストラクターインスタンスを作成する必要がありますnewInstance
Constructor
のメソッドサンプルコード:
import Java.lang.reflect.*;
class NewInstanceWithReflection{
public NewInstanceWithReflection(){
System.out.println("Default constructor");
}
public NewInstanceWithReflection( String a){
System.out.println("Constructor :String => "+a);
}
public static void main(String args[]) throws Exception {
NewInstanceWithReflection object = (NewInstanceWithReflection)Class.forName("NewInstanceWithReflection").newInstance();
Constructor constructor = NewInstanceWithReflection.class.getDeclaredConstructor( new Class[] {String.class});
NewInstanceWithReflection object1 = (NewInstanceWithReflection)constructor.newInstance(new Object[]{"StackOverFlow"});
}
}
出力:
Java NewInstanceWithReflection
Default constructor
Constructor :String => StackOverFlow
クラスが呼び出すオブジェクトを作成する必要がない場合があるのは、コンストラクターとメソッドです。直接オブジェクトを作成せずにクラスのメソッドを呼び出すことができます。パラメーターを指定してコンストラクターを呼び出すのは非常に簡単です。
import Java.lang.reflect.*;
import Java.util.*;
class RunDemo
{
public RunDemo(String s)
{
System.out.println("Hello, I'm a constructor. Welcome, "+s);
}
static void show()
{
System.out.println("Hello.");
}
}
class Democlass
{
public static void main(String args[])throws Exception
{
Class.forName("RunDemo");
Constructor c = RunDemo.class.getConstructor(String.class);
RunDemo d = (RunDemo)c.newInstance("User");
d.show();
}
}
出力は次のようになります。
こんにちは、私はコンストラクタです。ようこそ、ユーザー
こんにちは。
Class.forName( "RunDemo"); RunDemoクラスをロードします。
コンストラクターc = RunDemo.class.getConstructor(String.class); ConstructorクラスのgetConstructor()メソッドは、引数としてStringを持ち、その参照がConstructorクラスのオブジェクト 'c'に格納されているコンストラクタを返します。
RunDemo d =(RunDemo)c.newInstance( "User"); ConstructorクラスのメソッドnewInstance()はRundDemoクラスをインスタンス化し、オブジェクトのジェネリックバージョンを返します。これは、型キャストを使用してRunDemo型に変換されます。
RunDemoのオブジェクト「d」は、newInstance()メソッドによって返される参照を保持します。