programing

클래스 이름을 사용하여 인스턴스 생성 및 생성자 호출

prostudy 2022. 4. 23. 10:24
반응형

클래스 이름을 사용하여 인스턴스 생성 및 생성자 호출

클래스 이름(동적)이 지정된 특정 클래스의 인스턴스를 만들고 해당 생성자에게 매개 변수를 전달하는 방법이 있는가?

다음과 같은 경우:

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

참조URL: https://stackoverflow.com/questions/6094575/creating-an-instance-using-the-class-name-and-calling-constructor

반응형