Java.lang.reflect.Proxy, возвращающий другой прокси из вызова, приводит к ClassCastException при назначении

Так что я играю с geotools и подумал, что прокси один из их классов доступа к данным и прослежу, как он используется в их коде.

Я запрограммировал динамический прокси-сервер и включил в него FeatureSource (интерфейс), и все прошло успешно. Затем я хотел бы взглянуть на некоторые из транзитивных объектов, возвращаемых featureSource, так как главное, что FeatureSource делает, - это возврат FeatureCollection (FeatureSource аналогичен sql DataSource, а featurecollection - выражению sql).

в моем обработчике вызовов я только что передал вызов нижележащему объекту, распечатав целевой класс / метод / аргументы и результат, как я пошел, но для вызовов, которые возвратили FeatureCollection (другой интерфейс), я обернул этот объект в моем прокси ( тот же класс, но новый экземпляр, не должно ли это иметь значение?) и вернуть его. BAM! Исключение Classcast:

java.lang.ClassCastException: $Proxy5 cannot be cast to org.geotools.feature.FeatureCollection  
    at $Proxy4.getFeatures(Unknown Source)  
    at MyClass.myTestMethod(MyClass.java:295)  

вызывающий код:

FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = ... // create the FS
featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) FeatureSourceProxy.newInstance(featureSource, features);
featureSource.getBounds();// ok
featureSource.getSupportedHints();// ok

DefaultQuery query1 = new DefaultQuery(DefaultQuery.ALL);
FeatureCollection<SimpleFeatureType, SimpleFeature> results = featureSource.getFeatures(query1); //<- explosion here

Прокси:

public class FeatureSourceProxy  implements java.lang.reflect.InvocationHandler {

private Object target;
private List<SimpleFeature> features;

public static Object newInstance(Object obj, List<SimpleFeature> features) {
return java.lang.reflect.Proxy.newProxyInstance(
    obj.getClass().getClassLoader(), 
    obj.getClass().getInterfaces(), 
    new FeatureSourceProxy(obj, features)
);
}

private FeatureSourceProxy(Object obj, List<SimpleFeature> features) {
this.target = obj;
this.features = features;
}

public Object invoke(Object proxy, Method m, Object[] args)throws Throwable{
Object result = null;
try {
    if("getFeatures".equals(m.getName())){ 
        result = interceptGetFeatures(m, args);
    }
    else{
        result = m.invoke(target, args);
    }
} 
catch (Exception e) {
    throw new RuntimeException("unexpected invocation exception: " +  e.getMessage(), e);
} 
return result;
}

private Object interceptGetFeatures(Method m, Object[] args) throws Exception{
    return newInstance(m.invoke(target, args), features);
}

}

Можно ли динамически возвращать прокси интерфейсовот интерфейс прокси или я что-то не так делаю? ура!

Ответы на вопрос(2)

Ваш ответ на вопрос