这是潜在的意外行为的组合.首先,Spring使用CGLIB为AOP代理您的bean.CGLIB代理是类的动态子类型的实例,它将所有方法调用委托给类的实际实例.但是,即使代理是子类型,其字段也不会被初始化(即,TargetClass
不会调用您的超级构造函数).可以在这里找到更长的解释.
另外,你的方法
public final libvlc_media_list_t mediaListInstance() { return mediaListInstance; // <- proxy object return null, if use aop }
要么
public final String test() { System.out.println("TargetClass.test();"); return returnValue; }
是的final
.因此CGLIB不能覆盖它们以委托给实例.这将在Spring日志中暗示.例如,你会看到
22:35:31.773 [main] INFO o.s.aop.framework.CglibAopProxy - Unable to proxy method [public final java.lang.String com.example.root.TargetClass.test()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
将上述所有内容放在一起,您将获得一个代理实例,其中字段位于null
代理实例的方法所在的代理实例.所以你的代码实际上会调用
public final String test() { System.out.println("TargetClass.test();"); return returnValue; }
对于该returnValue
字段的实例null
.
如果可以,请更改方法,删除final
修改器.如果你不能,你将不得不重新考虑你的设计.
这是潜在的意外行为的组合.首先,Spring使用CGLIB为AOP代理您的bean.CGLIB代理是类的动态子类型的实例,它将所有方法调用委托给类的实际实例.但是,即使代理是子类型,其字段也不会被初始化(即,TargetClass
不会调用您的超级构造函数).可以在这里找到更长的解释.
另外,你的方法
public final libvlc_media_list_t mediaListInstance() { return mediaListInstance; // <- proxy object return null, if use aop }
要么
public final String test() { System.out.println("TargetClass.test();"); return returnValue; }
是的final
.因此CGLIB不能覆盖它们以委托给实例.这将在Spring日志中暗示.例如,你会看到
22:35:31.773 [main] INFO o.s.aop.framework.CglibAopProxy - Unable to proxy method [public final java.lang.String com.example.root.TargetClass.test()] because it is final: All calls to this method via a proxy will NOT be routed to the target instance.
将上述所有内容放在一起,您将获得一个代理实例,其中字段位于null
代理实例的方法所在的代理实例.所以你的代码实际上会调用
public final String test() { System.out.println("TargetClass.test();"); return returnValue; }
对于该returnValue
字段的实例null
.
如果可以,请更改方法,删除final
修改器.如果你不能,你将不得不重新考虑你的设计.