클래스 이름을 사용하여 인스턴스 생성 및 생성자 호출
클래스 이름(동적)이 지정된 특정 클래스의 인스턴스를 만들고 해당 생성자에게 매개 변수를 전달하는 방법이 있는가?
다음과 같은 경우:
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<?> 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);
클래스에 빈 생성자가 하나만 있는 경우(예: 활동 또는 조각 등, Android 클래스):
Class<?> myClass = Class.forName("com.example.MyClass");
Constructor<?> constructor = myClass.getConstructors()[0];
사용할 때(예:)getConstructor(String.lang)
건설업자는 공개되어야 한다.그렇지 않으면 aNoSuchMethodException
던져지다
공개되지 않은 생성자에 액세스하려면 대신 사용해야 하는 경우(예:getDeclaredConstructor(String.lang)
.
Java.lang.reflect를 사용하려는 경우.생성자.newInstance(개체...)
Java에서 개체를 만드는 매우 간단한 방법Class<?>
생성자 인수가 전달되는 경우:
사례 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:- 다중 인수를 사용하여 생성자에 대해 유사하게 코드화할 수 있으며 생성자를 복사하십시오.예를 들어, 3개의 변수를 매개 변수로 에 전달Base
시공자는 다음과 같이 시공자를 클래스에 만들고 위의 코드 변경을 필요로 할 것이다.
Constructor<?> ctr = myClass.getConstructor(String.class, String.class, String.class);
Object object = ctr.newInstance(new Object[] { "Arg1", "Arg2", "Arg3" });
그리고 여기서 베이스 클래스는 어떻게든 다음과 같이 보여야 한다.
public class Base {
public Base(String a, String b, String c){
// This constructor need to be created in this case.
}
}
참고:- 코드에서 처리해야 할 여러 가지 예외 사항들을 처리하는 것을 잊지 마라.
Singleton Pattern을 따르는 클래스에도 불구하고 클래스의 인스턴스를 만드는 방법을 찾고 있는 사람이 있다면, 여기에 이를 위한 방법이 있다.
// Get Class instance
Class<?> clazz = Class.forName("myPackage.MyClass");
// Get the private constructor.
Constructor<?> cons = clazz.getDeclaredConstructor();
// Since it is private, make it accessible.
cons.setAccessible(true);
// Create new object.
Object obj = cons.newInstance();
이것은 사설 생성자를 사용하여 싱글톤 패턴을 구현하는 클래스에만 적용된다.
또 다른 도움이 되는 대답.getConstructor(params)를 사용하는 방법newInstance(args)?
return Class.forName(**complete classname**)
.getConstructor(**here pass parameters passed in constructor**)
.newInstance(**here pass arguments**);
내 경우, 내 클래스의 생성자가 웹 드라이버를 매개 변수로 사용하므로, 아래 코드:
return Class.forName("com.page.BillablePage")
.getConstructor(WebDriver.class)
.newInstance(this.driver);
생성된 개체 내부에서 메서드를 호출할 수도 있다.
첫 번째 분석기를 호출하여 개체를 즉시 만든 다음 생성된 개체에서 첫 번째 방법을 호출할 수 있다.
Class<?> c = Class.forName("mypackage.MyClass");
Constructor<?> ctor = c.getConstructors()[0];
Object object=ctor.newInstance(new Object[]{"ContstractorArgs"});
c.getDeclaredMethods()[0].invoke(object,Object... MethodArgs);
'programing' 카테고리의 다른 글
최대 절전 모드 사용 시 매개 변수 값으로 쿼리 문자열을 인쇄하는 방법 (0) | 2022.04.23 |
---|---|
작성 및 읽기 작업에 동일한 양식을 사용 (0) | 2022.04.23 |
mockMvc를 사용하여 응답 본문에서 문자열을 확인하는 방법 (0) | 2022.04.23 |
HttpServletRequest에서 POST 요청 본문 가져오기 (0) | 2022.04.23 |
Vuetify Select 입력으로 어레이 데이터를 로드하는 방법 (0) | 2022.04.23 |