使用实现新接口的CGLIB创建mixins

时间:2013-03-28 14:14:09

标签: java cglib

首先,我认为这不一定是个好主意,我只是看看这是否真的有可能。我可以看到一些好处,例如不必显式转换为我们发送给客户端的对象,并使用接口将某些安全问题的字段列入黑名单。我绝对不会坚持这个想法,但我想尝试一下。

我们正在使用Spring MVC + Jackson直接从对象生成JSON。我们的域对象包含要发送到客户端的必要数据,我们有一个错误字符串列表,可以根据需要添加到每个传出的JSON请求中。

因此返回JSON可能类似于

{ name: 'woohoo', location : 'wahoo', errors : ['foo'] }

目前,我们有一个类可以模拟客户端应该是什么,但我们总是使用错误方法扩展一个公共基类。

所以,我们有:

interface NameAndLoc { 
  String getName(); 
  String getLocation(); 
}

interface ResponseErrors { 
  List<String> getErrors(); 
  void appendError(String); 
}

我们有两个实现这些接口的类,并希望让CGLIB生成一个新的类实现:

interface NameAndLocResponse extends NameAndLoc, ResponseErrors {}

目前,使用CGLIB mixins,我可以使用以下内容生成一个对象:

Object mish = Mixin.create(
   new Class [] {NameAndLoc.class, ResponseErrors.class},  
   new Object [] { new NameAndLocImpl(), new ResponseErrorsImpl() } );

然后我可以将对象强制转换为NameAndLoc或ResponseErrors,但是,我想要做的是创建一个使用相同支持类的对象,但实现NameAndLocResponse接口,而不必扩展我们的常见错误处理类和然后实现NameAndLoc。

如果我试图用我所拥有的东西进行施法,那就错了。我确信这是可能的。

我认为它与此非常相似,但不完全相同:http://www.jroller.com/melix/entry/alternative_to_delegate_pattern_with

1 个答案:

答案 0 :(得分:1)

只需将NameAndLocResponse接口添加到Class构造函数中的Mixin数组,作为 last 参数。生成的对象将实现它。您可以在此博客条目中找到此示例:http://mydailyjava.blogspot.no/2013/11/cglib-missing-manual.html