Javassist, как вызвать метод, определенный в суперклассе

У меня есть класс NFTypeSerializer, и я использую javassist для создания подкласса NFTypeSerializer.

    CtClass superCc = pool.get(NFTypeSerializer.class.getName());
    CtClass cc = pool.makeClass("HotelSerializer", superCc);

и я хочу переопределить метод doSerialize(), который определен в NFTypeSerializer.

    cc.addMethod(CtNewMethod.make("protected void doSerialize(Hotel value, NFSerializationRecord rec) {\n" +
            "        serializePrimitive(rec, \"name\", value.getName());\n" +
            "        serializePrimitive(rec, \"price\", value.getPrice());\n" +
            "    }", cc));

но ошибка возникает

Исключение в потоке «основной» javassist.CannotCompileException: [ошибка источника] serializePrimitive(com.netflix.zeno.serializer.NFSerializationRecord,java.lang.String,double) не найден в HotelSerializer в javassist.CtNewMethod.make(CtNewMethod.java:79 ) в javassist.CtNewMethod.make(CtNewMethod.java:45) в test.demo.javassist.ComponentBuilder.buildHotelSerializer(ComponentBuilder.java:60) в test.demo.javassist.ComponentBuilder.main(ComponentBuilder.java:88) в солнце .reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:606) в com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) Вызвано: ошибка компиляции: serializePrimitive(com.netflix.zeno.serializer.NFSerializationRecord,java.lang. Строка, двойная) не найдено в HotelSerializer в javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:723) в javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:688) в javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:157) в javassist.compiler .ast.CallExpr.accept(CallExpr.java:46) в javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:242) в javassist.compiler.CodeGen.atStmnt(CodeGen.java:330) в javassist.compiler.ast. Stmnt.accept(Stmnt.java:50) в javassist.compiler.CodeGen.atStmnt(CodeGen.java:351) в javassist.compiler.ast.Stmnt.accept(Stmnt.java:50) в javassist.compiler.CodeGen.atMethodBody (CodeGen.java:292) в javassist.compiler.CodeGen.atMethodDecl(CodeGen.java:274) в javassist.compiler.ast.MethodDecl.accept(MethodDecl.java:44) в javassist.compiler.Javac.compileMethod(Javac. java:169) в javassist.compiler.Javac.compile(Javac.java:95) в javassist.CtNewMethod.make(CtNewMethod.java:74) ... еще 8

метод serializePrimitive() определен в суперклассе, но я не могу вызвать его в CtNewMethod?


person Alexis    schedule 22.10.2015    source источник
comment
Пожалуйста, проверьте конструкторы, объявленные для serializePrimitive(). Возможно, вы передаете неправильные типы значений или в неправильной последовательности.   -  person Swastik Padhi    schedule 22.10.2015
comment
@CrakC, ты прав! объявление - serializePrimitive (NFSerializationRecord rec, String fieldName, Object value), и я должен вызывать его таким образом   -  person Alexis    schedule 22.10.2015
comment
Итак, согласно заголовку, третий параметр должен иметь тип Object, а вы указали double.   -  person Swastik Padhi    schedule 22.10.2015
comment
@CrakC, ты прав XD   -  person Alexis    schedule 22.10.2015
comment
Позвольте мне опубликовать то же самое в качестве ответа, чтобы вопрос можно было закрыть.   -  person Swastik Padhi    schedule 22.10.2015


Ответы (1)


Пожалуйста, проверьте конструкторы, объявленные для serializePrimitive(). Возможно, вы передаете неправильные типы значений или в неправильной последовательности.

Предоставляемые параметры-

serializePrimitive(NFSerializationRecord rec, String fieldName, double value)

Ожидаемые параметры-

serializePrimitive(NFSerializationRecord rec, String fieldName, Object value)

person Swastik Padhi    schedule 22.10.2015