ClassCastException при попытке создать объект Proxy - PullRequest
2 голосов
/ 11 апреля 2011

Я пытаюсь создать прокси для данного объекта Runnable, используя следующий код:

public class WorkInvocationHandler implements InvocationHandler {

    public static Runnable newProxyInstance(Runnable work) 
    {
        return (Runnable)java.lang.reflect.Proxy.newProxyInstance(
            work.getClass().getClassLoader(),
            getInterfacesWithMarker(work),
            new WorkInvocationHandler(work));
    }

    private static Class[] getInterfacesWithMarker(Runnable work)
    {
        List allInterfaces = new ArrayList();

        // add direct interfaces
        allInterfaces.addAll(Arrays.asList(work.getClass().getInterfaces()));

        // add interfaces of super classes
        Class superClass = work.getClass().getSuperclass();
        while (!superClass.equals(Object.class))
        {
          allInterfaces.addAll(Arrays.asList(superClass.getInterfaces()));
          superClass = superClass.getClass().getSuperclass();
        }

        // add marker interface
        allInterfaces.add(IWorkProxy.class);

        return (Class [])allInterfaces.toArray(new Class[allInterfaces.size()]);        
    }
}

Прокси должен реализовывать все интерфейсы, которые данный объект реализует с дополнительным интерфейсом маркера, который указывает, является липрокси уже создан.Поскольку я не знаю точно, что данный объект реализует Runnable напрямую, я пересекаю также все суперклассы, однако я предполагаю, что если он реализует другой интерфейс, который реализует Runnable, он будет работать, поэтому мне не нужно проходить также по иерархии интерфейсов..

Тем не менее, я все равно получаю ClassCastException при попытке привести прокси к Runnable:

java.lang.ClassCastException: $Proxy24 incompatible with java.lang.Runnable

Я пытаюсь понять, что могло вызвать это исключение.Иерархия классов данного объекта недоступна.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

ОБНОВЛЕНИЕ удален бесполезный код.

Это не проблема, но вы должны использовать Set<Class<?>>, когда соберете все интерфейсы, потому что вы можете получить дубликаты одного и того же интерфейса в иерархии.

1 голос
/ 11 апреля 2011

Ваш код для прогулки по суперклассам неверен. Заменить

superClass = superClass.getClass().getSuperclass();

с

superClass = superClass.getSuperclass();

В противном случае вы быстро доберетесь до java.lang.Class, а затем до java.lang.Object.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...