自定义Groovy MetaClassImpl报找不到匹配构造函数错误如何解决
问题解决方法
问题根因
自定义的MyMetaClassImpl使用单Class参数的父类构造初始化时,未正确加载Groovy POGO类编译期自动生成的隐式构造方法(包括无参构造、字段构造、Map构造),导致实例化Person时找不到匹配的构造方法。
解决方案
步骤1:修改MyMetaClassImpl构造
新增支持传入MetaClassRegistry的构造方法,匹配Groovy默认MetaClass的初始化流程:
import groovy.lang.MetaClassImpl; import groovy.lang.MetaClassRegistry; public class MyMetaClassImpl extends MetaClassImpl { // 新增带MetaClassRegistry的构造 public MyMetaClassImpl(MetaClassRegistry registry, Class theClass) { super(registry, theClass); } // 原有构造可保留 public MyMetaClassImpl(Class theClass) { super(theClass); } @Override public Object invokeMethod(Object object, String methodName, Object[] originalArguments) { System.out.println("invoke here"); return super.invokeMethod(object, methodName, originalArguments); } }
步骤2:修改自定义MetaClass的创建逻辑
创建MyMetaClassImpl实例时传入全局的MetaClassRegistry:
static MetaClassImpl invokeNormal() { // 传入全局Registry初始化自定义MetaClass MyMetaClassImpl norMetaClass = new MyMetaClassImpl(InvokerHelper.metaRegistry, Person.class) norMetaClass.initialize() InvokerHelper.metaRegistry.setMetaClass(Person.class, norMetaClass) return norMetaClass }
修改后重新运行即可正常实例化Person对象,同时自定义的invokeMethod逻辑也会生效。
注意事项
如果后续出现其他方法找不到的问题,可以在调用initialize()方法后,对比默认MetaClass的元方法列表,确认自定义MetaClass是否正确加载了所有类成员的元数据。
内容的提问来源于stack exchange,提问作者Crabime
相关产品推荐
相关产品推荐

