Как использовать getConstructor (params).newInstance(args)?

Это может быть глупый вопрос, но я новичок в Java, поэтому...

В настоящее время у меня есть код, clazz.asSubclass(asSubclassOfClass).getConstructor().newInstance() используется. Мне нужно передать некоторые аргументы, поэтому я хочу изменить его на: clazz.asSubclass(asSubclassOfClass).getConstructor(params).newInstance(args). Я не понимаю, что мне нужно передать в качестве параметров и что мне нужно передать в качестве аргументов. Скажем, я хотел передать строку "howdy" и некоторый объект типа XYZ, называемый XyzObj in. Как бы это указать? Что бы я передал как params и что бы я передал как args?

Ответ 1

В Java это называется Reflection.

Предполагая, что класс имеет этот конструктор, в противном случае вы получите исключение NoSuchMethod, которое я считаю.

clazz.asSubclass(asSubclassOfClass)
    .getConstructor(String.class,XYZ.class)
    .newInstance("howdy",XyzObj);

Поскольку вы новичок в Java, позвольте мне рассказать вам проще, чтобы вы могли понять, что происходит под капотом, когда вы это делаете.

Предположим, что у вас есть следующий класс:

public class ParentClazz{
        String someVar;
    public ParentClazz(){
        someVar="test";
    }
    public ParentClazz(String someVar){
        System.out.println("I have been invoked");
        this.someVar=someVar;
    }
}

Затем у вас есть следующий основной метод:

public static void main(String[] args) throws ParseException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
           ParentClazz.class.asSubclass(ParentClazz.class).getConstructor(String.class).newInstance("howdy");
    }

Если вы запустите это, вы увидите сообщение вывода вывода на консоль - я был вызван. Это означает, что при использовании рефлексии вы вызывали конструктор ParentClazz.

Вы можете сделать то же самое, если сценарий позволяет вам использовать стандартный процесс создания объекта:

ParentClazz clazz = new ParentClazz("howdy");

Надеюсь, это поможет вам понять это.

Ответ 2

Вот пример создания классов без нового ключевого слова. Классы принимают в качестве своих параметров другие классы как примитивы, так и объекты. В этом примере также показан экземпляр подкласса и создаваемого родительского класса

public class ConstructorInstantiateWithoutNew 
{
    @SuppressWarnings("rawtypes")
    public static void main( String [] args )
    {
        Class<Drinker> clazz_drinker = Drinker.class;
        Class [] paramTypes = { Fizz.class, Colour.class, int.class };
        Object [] paramValues = {  new Fizz(), new Colour(), new Integer(10) };

        Class<Drunk> clazz_drunk = Drunk.class;
        Class [] paramTypesSub = { Fizz.class, Colour.class, int.class, boolean.class };
        Object [] paramValuesSub = {  new Fizz(), new Colour(), new Integer(10), true };

        try 
        {
            Drinker drinker = clazz_drinker.getConstructor( paramTypes ).newInstance( paramValues );
            drinker.drink();

            Drunk drunk = clazz_drunk.getConstructor(paramTypesSub).newInstance(paramValuesSub);
            drunk.drink();
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
    }
}

class Drinker
{
    int n;

    public Drinker( Fizz f, Colour c, int n)
    {
        this.n = n;
    }

    public void drink()
    {
        System.out.println( "Dad drank " + (n*10) + " ml");
    }
}

class Drunk extends Drinker
{
    boolean trouble;
    public Drunk(Fizz f, Colour c, int n, boolean inDogHouse)
    {
        super(f,c,n);
        trouble = inDogHouse;
    }

    public void drink()
    {
        System.out.println( 
                "Dad is Grounded: " + trouble + 
                " as he drank over "+ 
                (n*10) + " ml");
    }
}

class Fizz {} class Colour {}

Надеюсь, это полезно

С уважением

Нареш Махарадж

Ответ 3

clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj)

Предполагается, что аргументы конструктора находятся в указанном порядке

Ответ 4

Вы использовали бы clazz.asSubclass(asSubclassOfClass).getConstructor(String.class, XYZ.class).newInstance("howdy", XyzObj);