[java] 클래스 이름과 호출 생성자를 사용하여 인스턴스 만들기

클래스 이름 (동적)이 주어진 특정 클래스의 인스턴스를 만들고 매개 변수를 생성자에 전달하는 방법이 있습니까?

다음과 같은 것 :

Object object = createInstance("mypackage.MyClass","MyAttributeValue");

"MyAttributeValue"의 생성자에 대한 인수는 어디에 있습니까 MyClass?



답변

예, 다음과 같습니다.

Class<?> clazz = Class.forName(className);
Constructor<?> ctor = clazz.getConstructor(String.class);
Object object = ctor.newInstance(new Object[] { ctorArgument });

물론 단일 문자열 매개 변수에서만 작동하지만 쉽게 수정할 수 있습니다.

클래스 이름은 네임 스페이스를 포함하여 정규화 된 이름이어야합니다. 중첩 클래스의 경우 1 달러를 사용해야합니다 (컴파일러가 사용하는 방식). 예를 들면 다음과 같습니다.

package foo;

public class Outer
{
    public static class Nested {}
}

이를 위해 Class객체 를 얻으 려면가 필요합니다 Class.forName("foo.Outer$Nested").


답변

원하는 클래스 Class.forName()Class객체 를 얻는 데 사용할 수 있습니다 .

그런 다음을 사용 getConstructor()하여 원하는 Constructor객체 를 찾으십시오 .

마지막으로 newInstance()해당 객체를 호출 하여 새 인스턴스를 가져옵니다.

Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> cons = c.getConstructor(String.class);
Object object = cons.newInstance("MyAttributeValue");


답변

반사를 사용할 수 있습니다

return Class.forName(className).getConstructor(String.class).newInstance(arg);


답변

클래스에 빈 생성자가 하나만있는 경우 (예 : Activity 또는 Fragment 등, Android 클래스) :

Class<?> myClass = Class.forName("com.example.MyClass");
Constructor<?> constructor = myClass.getConstructors()[0];


답변

(즉) getConstructor(String.lang)생성자를 사용할 때는 public으로 선언해야합니다. 그렇지 않으면 a NoSuchMethodException가 발생합니다.

비공개 생성자 에 액세스 하려면 대신 (즉) 사용해야합니다 getDeclaredConstructor(String.lang).


답변

java.lang.reflect.Constructor.newInstance (Object …)를 사용하고 싶습니다.


답변

Class<?>생성자 인수를 전달 하여 Java로 객체를 만드는 매우 간단한 방법 :

사례 1 :-
여기 에이 Main클래스 의 작은 코드가 있습니다 .

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Main {

    public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {

        // Get class name as string.
        String myClassName = Base.class.getName();
        // Create class of type Base.
        Class<?> myClass = Class.forName(myClassName);
        // Create constructor call with argument types.
        Constructor<?> ctr = myClass.getConstructor(String.class);
        // Finally create object of type Base and pass data to constructor.
        String arg1 = "My User Data";
        Object object = ctr.newInstance(new Object[] { arg1 });
        // Type-cast and access the data from class Base.
        Base base = (Base)object;
        System.out.println(base.data);
    }

}

그리고, 여기에 있습니다 Base클래스 구조는 :

public class Base {

    public String data = null;

    public Base()
    {
        data = "default";
        System.out.println("Base()");
    }

    public Base(String arg1) {
        data = arg1;
        System.out.println("Base("+arg1+")");
    }

}

사례 2 :- 여러 인수와 복사 생성자를 사용하여 생성자를 유사하게 코딩 할 수 있습니다. 예를 들어, Base생성자에 매개 변수로 3 개의 인수를 전달 하면 클래스에서 생성자를 작성하고 위와 같이 코드를 변경해야합니다.

Constructor<?> ctr = myClass.getConstructor(String.class, String.class, String.class);
Object object = ctr.newInstance(new Object[] { "Arg1", "Arg2", "Arg3" }); 

그리고 여기 Base 클래스는 어떻게 생겼을까 요?

public class Base {

    public Base(String a, String b, String c){
        // This constructor need to be created in this case.
    }
}

참고 :- 코드에서 처리해야하는 다양한 예외를 처리하는 것을 잊지 마십시오.