понедельник, 24 марта 2008 г.

Java Puzzle 78: Reflection Infection

Рассмотрим простое применение refletion. Что напечатает следующая программа?
import java.lang.reflection.*;
import java.util.*;
public class Reflector {
public static void main(String[] args)
throws Exception {
Set set = new HashSet();
set.add("foo");
Iterator it = set.iterator();
Class type = it.getClass();
Method method = type.getMethod("hasNext");
System.out.println(method.invoke(it));
}
}

Нашли, блин, чем меня удивить! Я с такими проблемами в JavaBeans регулярно сталкиваюсь. Несмотря на то, что метод определён как public, он определён в private классе. И у пользователя просто нет прав, чтобы его вызвать. Приходится рекурсивно проходить по иерархии классов и интерфейсов и искать его пототип, который действительно разрешён к использованию. Обратите внимание, что еcли метод получить другим образом, то он будет работать:
    Method method = Iterator.class.getMethod("hasNext");

Комментариев нет:

Отправить комментарий