클래스 이름 (동적)이 주어진 특정 클래스의 인스턴스를 만들고 매개 변수를 생성자에 전달하는 방법이 있습니까?
다음과 같은 것 :
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)
.
답변
답변
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.
}
}
참고 :- 코드에서 처리해야하는 다양한 예외를 처리하는 것을 잊지 마십시오.