我需要为一个类创建一个代理。我无法访问具体主题,只能访问主题界面。我还有一个工厂方法来创建原始实现的实例。
如果我使用Eclipse,我可以获得每个方法的存根:
@Override
public R1 method(T1 p1) {
// TODO Auto-generated method stub
return null;
}
我需要创建这样的实现:
@Override
public R1 method(T1 p1) {
return instance.method(p1);
}
因为有很多方法我使用regexp进行搜索和替换。搜索:
public ([a-z,A-Z,\.]*) ([a-z,A-Z]*)\(([a-z,A-Z]* ([a-z,A-Z]*))?\) \{\r\n([ ,\t]*)// TODO Auto-generated method stub\r\n[ ,\t]*return [0-9,a-z,A-Z]*\;
并替换为:
public \1 \2\(\3\) \{\r\n\5return instance\.\2\(\4\);
有更好的解决方案吗?
另一个问题来自采用更多参数的方法:
@Override
public R1 method(T1 p1, T2 p2) {
// TODO Auto-generated method stub
return null;
}
我找到的唯一解决方案是为每个参数数量设置不同的搜索替换对。有更好的解决方案吗?
答案 0 :(得分:1)
最简单的解决方案可能只是使用和IDE。例如,在Netbeans 7中,您可以编写以下框架:
public class MyProxy implements SomeInterface {
private SomeInterface instance;
}
然后将你的光标放在课堂内,点击ALT
和Insert
,选择“委托方法”,选择界面的所有方法,然后点击生成。
另一个更有活力的可能性是使用jdk的java.lang.reflect.Proxy类。这允许您在运行时定义实现给定接口的类:
public static SomeInterface create() {
return (SomeInterface)Proxy.newProxyInstance(MyProxy.class.getClassLoader(), new Class[]{SomeInterface.class}, new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("method1".equals(method.getName())) {
// Some special logic for this method
return null;
} else {
// delegate all other methods
return method.invoke(proxy, args);
}
}
});
}