Всем привет!
Помогите, пожалуйста, разобраться.
Список классов наследующих интерфейс нашел в отдельной процедуре
private static List<Class> findClassInClass(Class[] classes)
Проверяю, что бы они были статическими и приватными, то же вроде все "ок" - остается 3 класса:
class java.util.Collections$SingletonList
class java.util.Collections$CopiesList
class java.util.Collections$EmptyList
Потом получаю метод/методы/конструктор/конструкторы.
Пробовал все 4 вариант на всех 3 классов, методы:
getDeclaredMethod
getMethods
getDeclaredConstructor
getDeclaredConstructors
Не возвращают ничего... почему, понять не могу...
Точнее сказать, строка Method method = currentClass.getDeclaredMethod("get");
Возвращает ошибку нет такого метода, а остальные не возвращают ничего.
package com.javarush.task.task36.task3602;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*
Найти класс по описанию Ӏ Java Collections: 6 уровень, 6 лекция
*/
public class Solution {
public static void main(String[] args) {
System.out.println(getExpectedClass());
}
public static Class getExpectedClass() {
List<Class> classForTest = findClassInClass(Collections.class.getDeclaredClasses());
for (Class currentClass : classForTest){
if (Modifier.isStatic(currentClass.getModifiers()) &&
Modifier.isPrivate(currentClass.getModifiers())) {
try {
Method method = currentClass.getDeclaredMethod("get");
//Проблема вот тут возникает
for (Method m : currentClass.getMethods()) {
System.out.println(m.getName());
}
method.setAccessible(true);
Constructor constructor = currentClass.getDeclaredConstructor();
constructor.setAccessible(true);
method.invoke(constructor.newInstance(), 0);
}
catch (InvocationTargetException e) {
//System.out.println(currentClass);
if (e.getCause() == new IndexOutOfBoundsException()) {
return currentClass;
}
}
catch (Exception e) {
}
}
}
return null;
}
private static List<Class> findClassInClass(Class[] classes) {
List<Class> classForTest = new ArrayList<>();
for (Class currentClass : classes) {
Class superClass = currentClass.getSuperclass();
while (superClass !=null) {
for (Class currentInterface : superClass.getInterfaces()) {
if (currentInterface.getSimpleName().equals("List")) {
classForTest.add(currentClass);
}
}
superClass = superClass.getSuperclass();
}
}
return classForTest;
}
}