Я пытаюсь динамически загрузить файл Java .class и вызвать его по отражению.
У меня есть класс под названием Foo; он имеет пустой конструктор и имеет один метод с именем doit (), который принимает аргумент String и возвращает 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 других людей) могли пропустить это. Теперь я чувствую себя глупо ..