Рассмотрим этот пример кода (не имеет цикла для простоты):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Main {
interface Interface {
public void run();
}
static class Hello /* does't implement Interface */{
public void run() {
System.out.println("Hello, world!!");
}
}
static <T> T dirtyCast(Class<T> intrface, final Object target) {
return intrface.cast(Proxy.newProxyInstance(
intrface.getClassLoader(),
new Class<?>[] { intrface }, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
Method targetMethod = target.getClass().getMethod(
method.getName(), method.getParameterTypes());
return targetMethod.invoke(target, args);
}
}));
}
public static void main(String[] args) {
Interface proxy = dirtyCast(Interface.class, new Hello());
proxy.run();
}
}
Пожалуйста, не рассматривайте это решение как выполнимое, если вы хотите передать аргументы или вернуть значения или выбросить исключения. Проблема заключается в том, что общие объекты (как аргументы, возвращаемые значения и исключения) должны находиться в одном (общем) загрузчике классов. Это также означает, что с обычными типами и исключениями Java-языка все будет в порядке.
Также вы должны учитывать соображения безопасности. Загрузчики классов могут иметь разные (несовместимые) ограничения безопасности.
Если вы быстро столкнетесь с проблемами, я бы попробовал проект, разработанный для этого, например transloader .
Веселитесь.