java отражение constructor.newInstance дает "неправильное количество аргументов" - PullRequest
0 голосов
/ 09 ноября 2018

Как исправить мой код ниже?

package mypackage;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;

public class testReflection {
    public class You {
        public You(String s) {
        }

        public void f(String s, int i) {
            System.out.println(i + 100);
        }
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Constructor constructor =
                You.class.getConstructor(testReflection.class, String.class);
        try {
            You y = (You)constructor.newInstance("xzy");//Exception!!!!
            System.out.println("ok");
            y.f("xyz",2);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

Сообщение об исключении:

java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at mypackage.testReflection.main

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Подсказка в этой строке (конструктор принимает 2 параметра):

Constructor constructor =
            You.class.getConstructor(testReflection.class, String.class);

Вам необходимо отправить экземпляр с testReflection на newInstance():

testReflection outerObject = new testReflection();
You y = (You)constructor.newInstance(outerObject,  "xzy");
0 голосов
/ 09 ноября 2018

Из документации из Constructor#newInstance:

Если декларирующий класс конструктора является внутренним классом в нестатическом контексте, первым аргументом конструктора должен быть включающий экземпляр; см. раздел 15.9.3 Спецификации языка Java ™.

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

You y = (You) constructor.newInstance(new testReflection(), "xzy");

Я также рекомендую изменить имя вашего класса на TestReflection, так как это соответствует правилам именования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...