Я пытаюсь загрузить файл java .class динамически и называть его отражением.Загрузка класса Java выполняется очень медленно?
У меня есть класс под названием Foo; он имеет пустой конструктор и имеет один метод, называемый doit(), который принимает аргумент String и возвращает строку. Также он меняет направление строки.
Вот мой код:
URL url = new URL("file://C:/jtest/");
URLClassLoader loader = new URLClassLoader(new URL[]{url});
Class<?> cl = loader.loadClass("Foo");
Constructor<?> cons = cl.getConstructor((Class[])null);
Object ins = cons.newInstance(new Object[]{});
Method meth = cl.getDeclaredMethod("doit", String.class);
Object ret = meth.invoke(ins, new Object[]{"!dlroW olleH"});
System.out.println((String)ret);
Как и ожидалось, это печатает "Hello World!". Однако для завершения требуется около 30 секунд. Я знаю, что отражение происходит медленно, но я ожидаю, что это будет 10 мс или что-то еще.
Я использую Eclipse с JRE 1.6.0_13, и я запускаю Windows Vista.
Что я здесь делаю неправильно?
Спасибо.
Редактировать: Я профилировал код, и все его время используется в третьей строке (loadClass()). Все остальное происходит мгновенно.
Редактировать: Я поместил код в цикл; медленная функция каким-то образом оптимизируется и занимает 30 секунд только в первом цикле.
Редактировать: Я нашел решение.
Вместо:
URL url = new URL("file://C:/jtest/");
Я изменил его:
URL url = new URL("file:/C:/jtest/");
Теперь он отлично работает. Я не знаю, почему это работает, но я не понимаю, как я (и еще 5 человек) мог пропустить это. Теперь я чувствую себя немым.
loadClass сначала проверяет кеш, чтобы узнать, загружен ли класс, если я правильно помню. Это объясняет, почему это не займет много времени на второй итерации. –
Является ли настоящий «Foo» в пакете? Загрузка из пакета по умолчанию (без пакета) может иметь странные эффекты. Попробуйте перейти к foo.Foo. – flicken
Это интересный ... новый URL («файл:/C:/jtest /»). GetPath() is/C:/jtest /. Интересно, как это интерпретирует URLClassLoader. –