Создание нового типа с Javassist - PullRequest
0 голосов
/ 27 января 2012
    ClassPool classPool = ClassPool.getDefault();
        CtClass person = classPool.get("main.Person");
        CtClass pperson = classPool.makeClass("PPerson", classPool.get("main.Person")); //is sub-type


        CtField dadField = new CtField(person, "dad", pperson);
        dadField.setModifiers(Modifier.PUBLIC);
        pperson.addField(dadField);



        CtField momField = new CtField(person, "mom", pperson);
        momField.setModifiers(Modifier.PRIVATE);
        pperson.addField(momField);


        CtMethod momGetter = CtNewMethod.getter("getMom", momField);
        pperson.addMethod(momGetter);

        CtMethod momSetter = CtNewMethod.setter("setMom", momField);
        pperson.addMethod(momSetter);


        Class ppersonClass = pperson.toClass();

        Person pp = (Person) ppersonClass.newInstance();

        pp.setFirstname("a");
        pp.setLastname("b");

        Person mom = new Person(); mom.setFirstname("momi"); mom.setLastname("momi");

        for (Method m : ppersonClass.getDeclaredMethods()) {
            System.out.println(m.getName());
        }
        //--------------

        Method setMom = ppersonClass.getDeclaredMethod("setMom", Person.class);
        setMom.invoke(pp, mom);

        Method getMom = ppersonClass.getDeclaredMethod("getMom", Person.class);

вывод:

getMom setMom java.lang.NoSuchMethodException: PPerson.getMom (main.Person) в java.lang.Class.getDeclaredMethod (Неизвестный источник) at main.Main.main (Main.java:69)

Почему он не видит поле "getMom" во второй раз?

1 Ответ

0 голосов
/ 13 февраля 2012

Поскольку выражение getDeclaredMethod("getMom", Person.class) ищет метод getMom с формальным параметром типа Person, которого не существует, поскольку созданный вами метод получения не имеет никаких формальных параметров. Отсюда и NoSuchMethodException.

...