java-以编程方式实现一个接口,该接口以各种指定方式组合了同一接口的某些实例
作者:互联网
实现以各种指定方式组合同一接口的某些实例的接口的最佳方法是什么?我需要对多个接口执行此操作,并且我希望尽量减少样板并仍然实现良好的效率,因为对于关键的生产系统,我需要这样做.
这是问题的示意图.
抽象地,我有一个通用的组合器类,它接收实例并指定各种组合器:
class Combiner<I> {
I[] instances;
<T> T combineSomeWay(InstanceMethod<I,T> method) {
// ... method.call(instances[i]) ... combined in some way ...
}
// more combinators
}
现在,假设我要实现以下接口,其中包括:
Interface Foo {
String bar(int baz);
}
我想结束这样的代码:
class FooCombiner implements Foo {
Combiner<Foo> combiner;
@Override
public String bar(final int baz) {
return combiner.combineSomeWay(new InstanceMethod<Foo, String> {
@Override public call(Foo instance) { return instance.bar(baz); }
});
}
}
现在,如果接口有很多方法,这很快就会变得很麻烦.我知道我可以使用Java Reflection API中的动态代理来实现这样的接口,但是通过反射进行方法访问要慢一百倍.那么在这种情况下,有哪些替代样板和反射的方法呢?
解决方法:
我会建议使用动态代理-这是否真的比现在的常规方法调用要慢得多-我听说反射在幕后掩盖了很多魔术,从而加快了重复方法的调用. (如果速度慢了100倍,您确定会注意到吗?好吧,只要重新阅读您的问题-您就会发现!)
否则,您基本上会遇到以下问题的解决方案:使用Command对象将每个方法包装在界面中.然后,您可以将接口集合中的每个实例传递给命令对象进行处理.
当然,如果您感到勇敢和冒险,可以使用cglib,javassist或dynamic bytecode generator使用动态类生成来生成命令对象的实现以及组合器接口的实现.这样可以避免样板.
您也可能在方面方面取得了一些成功,特别是在编译时或加载时编织方面的AspectJ,因此避免了反射开销.对不起,我不能提供细节.
标签:proxy-classes,reflection,code-generation,java 来源: https://codeday.me/bug/20191210/2098775.html