ClassCastException при использовании Java Reflection - PullRequest
0 голосов
/ 30 мая 2018

Я работаю с заглушкой, которая получает данные от скелета:

MethodCallMessage reply = messageManager.wReceive();
        String returnString = reply.getParameter("result.string");
        int returnInt = Integer.parseInt(reply.getParameter("result.integer"));
        char returnChar = reply.getParameter("result.character").charAt(0);
        boolean returnBool = Boolean.valueOf(reply.getParameter("result.bool"));
        System.out.println("String return value in Invocation Handler: " + returnString);
        System.out.println("Int return value in Invocation Handler: " + returnInt);
        System.out.println("Char value in Invocation Handler: " + String.valueOf(returnChar));
        System.out.println("Bool value in Invocation Handler: " + String.valueOf(returnBool));

Затем я пытаюсь создать экземпляр класса, который находится в другом пакете:

Class c = Class.forName(method.getReturnType().getName());
c.newInstance();

Я могу добраться до методов, так что я подумал, что все было прекрасно:

Method[] methods = c.getDeclaredMethods();
        System.out.println("size: " + methods.length);
        for(Method method1: methods){
            System.out.println(method1.getName());
            if(method1.getReturnType().getSimpleName().equals("string")){
                System.out.println("heir");
                method1.invoke(c, returnString);
            }
            if(method1.getReturnType().getSimpleName().equals("int")){
                method1.invoke(c, returnInt);
            }
            if(method1.getReturnType().getSimpleName().equals("char")){
                method1.invoke(c, returnChar);
            }
            if(method1.getReturnType().getSimpleName().equals("boolean")){
                method1.invoke(c, returnBool);
            }

        }

и в конце всего этого я возвращаю объект:

return c;

Но тогда я получаю:

java.lang.ClassCastException: java.lang.Class cannot be cast to be.kdg.distrib.testclasses.TestObject

Пакет - это то, что я передаю через Class.forName ().Почему я могу получить доступ к методам и полям, но могу привести их?

РЕДАКТИРОВАТЬ:

Для пояснения этот код написан в StubInvocationHandler и предназначен для передачиследующий тест:

@Test
public void testWithObjectReturnValue() {
    testSkeleton.sendObjectReturnValue();
    TestInterface stub = (TestInterface) StubFactory.createStub(TestInterface.class, "127.0.0.1", port);
    TestObject test = stub.testMethod11();
    MethodCallMessage message = testSkeleton.getMessage();
    assertEquals("testMethod11", message.getMethodName());
    assertEquals(0, message.getParameters().size());
    assertEquals('r', test.getCharacter());
    assertEquals("bloop", test.getString());
    assertEquals(123, test.getInteger());
    assertTrue(test.isBool());
}

А вот и трассировка стека:

java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)

1 Ответ

0 голосов
/ 30 мая 2018

Не используйте сырые типы!Используйте Class<?> вместо Class!

Основная проблема заключается в том, что вы передаете c в качестве объектов для вызова методов.c имеет тип Class, определенно не тот тип, в котором объявляются методы, которые вы хотите вызвать:)

Кажется, вы знаете, что для вызова методов необходимо создать экземпляр, вызвав c.newInstance, но вы забыли присвоить переменную:

Object instance = c.newInstance();

Вы должны передать instance, а не c.

Кроме того, вы уверены, что возвращение c является правильным?Из вашего теста кажется, что testMethod11 должен возвращать TestObject, что означает, что вместо этого instance должен быть перенастроен.

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