web-dev-qa-db-ja.com

文字列パラメーターを受け取るコンストラクターでクラスオブジェクトをインスタンス化しますか?

単一のClass引数を受け取るコンストラクターを使用して、Stringオブジェクトからオブジェクトをインスタンス化したいです。

ここに私が望むものに近づくいくつかのコードがあります:

Object object = null;
Class classDefinition = Class.forName("javax.swing.JLabel");
object = classDefinition.newInstance();

ただし、テキストなしでJLabelオブジェクトをインスタンス化します。文字列を初期テキストとして受け入れるJLabelコンストラクターを使用したいと思います。 Classオブジェクトから特定のコンストラクターを選択する方法はありますか?

71
HAMID

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");

これで完了です。

追伸最後の手段としてのみリフレクションを使用してください!

106
mwittrock

次はあなたのために働くでしょう。これを試して、

Class[] type = { String.class };
Class classDefinition = Class.forName("javax.swing.JLabel"); 
Constructor cons = classDefinition .getConstructor(type);
Object[] obj = { "JLabel"};
return cons.newInstance(obj);
13
Jothi

Class.forName("className").newInstance()は常に引数なしのデフォルトコンストラクターを呼び出します。

引数なしの引数なしのコンストラクタではなく、パラメータ化されたコンストラクタを呼び出すには、

  1. ConstructorgetDeclaredConstructorメソッドにClass[]で型を渡すことで、Classをパラメーター型で取得する必要があります
  2. Object[]に値を渡すことでコンストラクターインスタンスを作成する必要があります
    newInstanceConstructorのメソッド

サンプルコード:

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
3
Ravindra babu

クラスが呼び出すオブジェクトを作成する必要がない場合があるのは、コンストラクターとメソッドです。直接オブジェクトを作成せずにクラスのメソッドを呼び出すことができます。パラメーターを指定してコンストラクターを呼び出すのは非常に簡単です。

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()メソッドによって返される参照を保持します。

1
reshmi reddy