在不使用动态代理打扰开发人员的情况下,我有哪些可能性可以向方法(带注释)添加功能?
经典例子:
public int sum(int x, int y){
StaticInstance.doThisBefore(x,y); // ccc
int result = x+y; // business functionality
StaticInstance.doThisAfter(result); // ccc
return result;
}
动态代理到底能做什么。动态代理的问题是,它是一种侵入性的方式。
- 注释处理器让您只能创建新类,而不能修改现有类(我说得对吗?)
- 修改字节码?
- 代码编织者?
- 无法使用代理。
开发人员可能正在使用 Spring 框架、Java EE 或他喜欢的任何框架,因此开发人员编码的风格和方式不受影响非常重要。
因此,该选项应该不具有干扰性,这一点非常重要。
最佳答案
您可以向程序员提供一个抽象类,其中包含一个调用要从子类实现的实际业务方法的方法。 调用完整功能的方法应该由接口(interface)支持:
public interface Service {
int getResult(int x, int y);
}
抽象类实现了接口(interface),但将实际的业务逻辑方法留给子类实现:
public abstract class AbstractClass implements Service {
public int getResult(int x, int y) {
StaticInstance.doThisBefore(x,y); // ccc
int result = process(x, y);
StaticInstance.doThisAfter(result); // ccc
}
// this is the actual business logic to be implemented by subclasses
public abstract int process(int x, int y);
}
子类将实现实际的业务逻辑,例如:
public class MyClass extends AbstractClass {
public int process(int x, int y) {
return x+y;
}
}
因此,开发人员只需记住子类 AbstractClass
,但他的代码只处理实际的业务逻辑。
最后,从您的代码调用此服务将是:
Service myService = new MyClass();
System.out.println(myService.getResult(5, 6));
关于java - 注入(inject)功能的方式(类似于动态代理但侵入性较小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40017626/