отражение и полиморфизм - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь вызвать метод в классе с помощью отражения. Метод находится внутри класса EJB. Я продолжаю получать метод не найден. Я написал следующий код для устранения проблемы. Один из параметров (интерфейс, определенный внутри фляги), кажется, тот же самый, но есть хеш-код, который вызывает проблему. Я проверил версии jar как в коде вызова, так и в коде Кейли. В коде вызова хэш-код одинаков для всех вызовов. Но в коде вызываемого абонента хеш-код для интерфейса продолжает изменять любые указатели ??

private static Method findMethod(   Class<?> encapsulatingClass, Class<?>[] paramArray, String methodName) { 
    Method[] methods = encapsulatingClass.getDeclaredMethods(); 
    Method method = null; 
    for (int i = 0; i < methods.length; i++) {
        method  = methods[i];
        Class<?>[] paramTypes = method.getParameterTypes(); 
        if (method.getName().equals(methodName) ) {
            if(paramTypes.length ==  paramArray.length){ 
                for(int j = 0;j<paramTypes.length;j++){
                    if(!paramTypes[j].equals(paramArray[j])){ 
                        Debug.info("Method argument " + paramTypes[j].getName() + " hashcode = " 
                        + paramTypes[j].hashCode() + "Parameter " + paramArray[j].getName() + " Hashcode = " +
                        paramArray[j].hashCode()); 
                        if(paramTypes[j].getName().equals(paramArray[j].getName())){
                            Debug.info("Atleast Parameter name seems to be same"); 
                        }else{ 
                            Debug.info("Strange cant find a diff can u??"); 
                            Debug.info("String 1 = " + paramTypes[j].getName() + " String 2 = " + paramArray[j].getName()); 
                        }

                    } 
                } 
            } 
            break; 
        } 
    } 
    return method; 
}

1 Ответ

1 голос
/ 01 декабря 2011

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

В основном это происходит, когда ваш клиент и сервер работают в разных JVM или когда ваш сервер приложений вводит несколько загрузчиков классов для обеспечения изоляции приложения.

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