Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 1
Регистрация: 25.10.2012
Сообщений: 87
1

Вызвать некоторый метод у некоторого класс с использованием рефлексии

08.06.2017, 21:55. Показов 377. Ответов 0
Метки нет (Все метки)

Условие задачи: есть некоторый класс со множеством внутренних классов, и надо среди этих внутренних классов найти тот, у которого все методы с параметрами определённого типа бросают определённый эксепшн. У собственно не получается создать экземпляр этого класса, чтобы передать его в вызов метода (c помощью invoke()).
Вот мой код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
Object[] inputObjects  = new Object[params.length];
                    for (int i = 0; i < inputObjects.length; i++) {
                        try {
                            boolean isLong = params[i].equals(long.class);
                            boolean isInt = params[i].equals(int.class);
                            boolean isShort = params[i].equals(short.class);
                            boolean isByte = params[i].equals(byte.class);
                            boolean isChar = params[i].equals(char.class);
                            boolean isFloat = params[i].equals(float.class);
                            boolean isDouble = params[i].equals(double.class);
                            boolean isBoolean = params[i].equals(boolean.class);
                            boolean isString = params[i].equals(String.class);
 
 
                            if (isLong || isInt || isShort || isByte)
                                inputObjects[i] = 1;
                            else if (isChar)
                                inputObjects[i] = 'a';
                            else if(isFloat || isDouble)
                                inputObjects[i] = 1.0f;
                            else if (isBoolean)
                                inputObjects[i] = true;
                            else if (isString)
                                inputObjects[i] = "aaa";
                            else
                                inputObjects[i] = params[i].newInstance();
 
                        } catch (InstantiationException|IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    }
 
                    if (Modifier.isPrivate(methodOfClass.getModifiers()))
                        methodOfClass.setAccessible(true);
                    if (Modifier.isStatic(methodOfClass.getModifiers())) {
                        try {
                            methodOfClass.invoke(null, inputObjects);
                        } catch (IllegalAccessException|InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (IndexOutOfBoundsException e) {
                            throwsIndexOutOfBoundsException = true;
                        }
                    }
                    else {
                        try {
                            Object instanceOfClass = null;
                            try {
                                instanceOfClass = classOfClasses.newInstance();
                            } catch (InstantiationException e) {
                                Constructor constructor = classOfClasses.getDeclaredConstructors()[0];
                                Class[] paramsConstr = constructor.getParameterTypes();
                                Object[] inputObjectsInConstr  = new Object[paramsConstr.length];
                                for (int i = 0; i < inputObjectsInConstr.length; i++) {
                                    try {
                                        boolean isLong = paramsConstr[i].equals(long.class);
                                        boolean isInt = paramsConstr[i].equals(int.class);
                                        boolean isShort = paramsConstr[i].equals(short.class);
                                        boolean isByte = paramsConstr[i].equals(byte.class);
                                        boolean isChar = paramsConstr[i].equals(char.class);
                                        boolean isFloat = paramsConstr[i].equals(float.class);
                                        boolean isDouble = paramsConstr[i].equals(double.class);
                                        boolean isBoolean = paramsConstr[i].equals(boolean.class);
                                        boolean isString = paramsConstr[i].equals(String.class);
 
 
                                        if (isLong || isInt || isShort || isByte)
                                            inputObjects[i] = 1;
                                        else if (isChar)
                                            inputObjects[i] = 'a';
                                        else if(isFloat || isDouble)
                                            inputObjects[i] = 1.0f;
                                        else if (isBoolean)
                                            inputObjects[i] = true;
                                        else if (isString)
                                            inputObjects[i] = "aaa";
                                        else
                                            inputObjects[i] = paramsConstr[i].newInstance();
 
                                    } catch (InstantiationException|IllegalAccessException ex) {
                                        ex.printStackTrace();
                                    }
                                }
                                if (Modifier.isPrivate(constructor.getModifiers()))
                                    constructor.setAccessible(true);
                                try {
                                    instanceOfClass = constructor.newInstance(inputObjectsInConstr);
                                } catch (IllegalAccessException|InstantiationException e1) {
                                    e1.printStackTrace();
                                }
 
                            }
 
                            methodOfClass.invoke(instanceOfClass, inputObjects);
                        } catch (IllegalAccessException|InvocationTargetException e) {
                            e.printStackTrace();
                        } catch (IndexOutOfBoundsException e) {
                            throwsIndexOutOfBoundsException = true;
                        }
Строчка " instanceOfClass = constructor.newInstance(inputObjectsInConstr);" кидает IllegalAccessException.

Добавлено через 2 часа 51 минуту
Немного разобрался в этом. У меня некоторые конструкторы были с доступом по умолчанию. Сделал и проверку на это (а также на протектед). Но после этого начал выбрасываться этот экспешн уже методом. Он был с паблик-доступом. Видимо, влияет приватность самого внутренного класса. Пока вообще убрал условие и оставил прямую установку доступ в тру.
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2017, 21:55
Ответы с готовыми решениями:

Вызвать метод из класса MyArray при помощи рефлексии
Помогите пожалуйста со следующим вопросом: есть метод в классе MyArray, который надо вызвать при...

С помощью рефлексии нужно вызвать метод динамически подключенной библиотеки
С помощью рефлексии нужно вызвать метод динамически подключенной библиотеки. Делаю так: ...

Шаблоны: определить класс в функции и вызвать его метод
Здравствуйте форумчане. Есть два класса: class WSelectionBox { public: WSelectionBox() =...

Как вызвать метод из одного класса в другой класс
Подскажите пожалуйста как вызвать метод из другого класса: class A { public: B *b; void...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2017, 21:55

Возможно ли вызвать метод наследника через указатель на базовый класс
Возможно ли вызвать метод наследника,через указатель на базовый класс, если он не определён как...

Скрыть метод от рефлексии
Есть следующий код. Требуется, чтобы после вызова метода HideBar, метод Bar не попадал в массив...

Eсть событие в WindowsForms button1_click и есть класс. Как вызвать метод класса в событии?
необходимо в самом событии баттон клик вызвать то что содержится в отдельном классе

Изменение модификаторов доступности методов и полей стороннего класса с использованием рефлексии
Мне необходимо осуществить изменение модификаторов доступности методов и полей стороннего класса с...

Помогите вытащить метод для элемента массива с помощю рефлексии
помогите вызвать метод елемента массива, который являеться екземпляром класса и имеет свои методы ...

Как вызвать метод info в метод Main и с какими параметрами?
я новичок в C#, так что не судите строго.. Я не думаю что это кому-то покажется сложным, но у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.