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

输出是:用Javassist创建新型

getMom setMom java.lang.NoSuchMethodException:PPerson.getMom(main.Person) 在java.lang.Class.getDeclaredMethod(未知源) at main.main.main(Main.java:69)

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

回答

0

因为表达getDeclaredMethod("getMom", Person.class)寻找一个方法getMomPerson类型的形式参数,它不存在,因为你所创建的吸气剂没有任何正式的参数。因此,NoSuchMethodException。