exception setting property value with CGLIB 解决方法

 

先google了一下

1.exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of
又见这样的错误,原因是对于一些数字项由于从数据库里面取出的值为null

2.映射为bolean的字段,在建表时,如果没有设定字段的default值,会导致exception setting property value with CGLIB setter错误.设置好默认值问题就可以解决了

我的问题是第一种,测试数据null 就是这种错误....

 

解决方法:给新添加的空字段设置好默认值;
CGLIB是一个强大的、高性能的代码生成库,它可以用来操作字节码。在Java中,CGLIB可以被用来在运行时扩展或实现类,而不需要改变源代码。使用CGLIB添加新的字段和方法通常涉及到创建一个子类,通过重写父类的方法或者提供新的方法实现来添加新的功能。 以下是使用CGLIB添加新字段和方法的一般步骤: 1. 创建一个`MethodInterceptor`实现。这个拦截器将定义要添加的新字段和方法的行为。 2. 使用`Enhancer`类来创建目标类的子类。这个子类将会继承目标类并应用`MethodInterceptor`。 3. 在拦截器中通过`CglibProxy`的`setCallbacks`方法设置回调数组,通常只包含一个元素,即你自定义的`MethodInterceptor`。 4. 实现`MethodInterceptor`的`intercept`方法,在这个方法中你可以根据需要添加逻辑来处理方法调用。 5. 你可以通过`FieldAccessor`接口来添加和访问新的字段。 需要注意的是,使用CGLIB添加字段通常涉及到通过反射来操作字节码,但这样的操作应当谨慎进行,因为它可能会影响性能,并且增加了程序的复杂度。 下面是一个简单的例子来说明如何使用CGLIB添加新的字段和方法: ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Field; public class CglibExample { public static void main(String[] args) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(MyClass.class); // MyClass是你想要扩展的类 enhancer.setCallback(new MyMethodInterceptor()); MyClass proxy = (MyClass) enhancer.create(); proxy.someMethod(); } } class MyClass { public void someMethod() { System.out.println("Original method called."); } } class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { // 在这里可以添加逻辑来处理方法调用,或者调用原方法 // 添加新的字段和方法逻辑 // 例如,添加一个新的字段并进行操作 // 这里仅作为示例,实际情况下需要通过字节码操作类的字段 Field newField = obj.getClass().getDeclaredField("newField"); newField.setAccessible(true); newField.set(obj, "newValue"); // 调用原方法 return proxy.invokeSuper(obj, args); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值