Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 使用Javassist创建新类型_Reflection_Runtime_Bytecode_Bytecode Manipulation_Javassist - Fatal编程技术网

Reflection 使用Javassist创建新类型

Reflection 使用Javassist创建新类型,reflection,runtime,bytecode,bytecode-manipulation,javassist,Reflection,Runtime,Bytecode,Bytecode Manipulation,Javassist,输出为: 格特姆 塞特姆 java.lang.NoSuchMethodException:PPerson.getMommain.Person 位于java.lang.Class.getDeclaredMethodUnknown源 at main.main.mainMain.java:69 为什么第二次看不到getMom字段?因为表达式getDeclaredMethodgetMom,Person.class查找具有Person类型的形式参数的方法getMom,它不存在,因为您创建的getter没有

输出为:

格特姆 塞特姆 java.lang.NoSuchMethodException:PPerson.getMommain.Person 位于java.lang.Class.getDeclaredMethodUnknown源 at main.main.mainMain.java:69

为什么第二次看不到getMom字段?

因为表达式getDeclaredMethodgetMom,Person.class查找具有Person类型的形式参数的方法getMom,它不存在,因为您创建的getter没有任何形式参数。因此,NosuchMethod例外

    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);