Java注释可以帮助我吗?
我想知道是否有方法来指定在类方法之前调用方法。 我知道这样的事情应该是可行的,因为JUnit之前有(),我想要做的是类似的。
这是我想要做的一个具体例子
class A {
public void init(int a) {
System.out.println(a);
}
@magic(arg=1)
public void foo() {
//
}
public static void main() {
A a = new A();
a.foo();
}
}
//Output: 1
基本上我想要一个注释来告诉编译器或者在foo()之前调用jvm调用init()
如果你有interface A
你可以用Proxy
来包装这个接口的实例,在它的InvocationHandler
内部invoke
方法中,你可以自由地检查方法是否被注释,并根据下面的内容执行一些操作:
class Initalizer implements InvocationHandler {
private A delegate;
Initializer(A delegate) {
this.delegate = delegate;
}
public Object invoke(Object proxy, Method method, Object[] args) {
if (method.isAnnotationPresent(magic.class)) {
magic annotation = method.getAnnotation(magic.class);
delegate.init(magic.arg);
}
method.invoke(delegate, args);
}
}
A realA = ...;
A obj = Proxy.newProxyInstance(A.class.getClassLoader(), new Class[] {A.class}, new Initializer(realA));
或者你可以尝试使用AspectJ的“before”建议。 这将是下一个东西:
@Aspect
public class Initializer {
@Before("@annotation(your.package.magic) && target(obj) && @annotation(annotation)")
private void initialize(A obj, magic annotation) {
a.init(annotation.arg);
}
}
我不确定这些代码段是否正在工作,它们只是说明了想法。
你为什么做这个? 你是否试图避免让一个具有许多参数的构造函数(使用setter然后调用init)还是避免使用许多构造函数都有类似的参数? 如果是这种情况,您可以使用构建器模式。
public class Foo {
int a, b, c, d, e;
Foo(int a, int b, int c, int d, int e) { this.a=a; /*etc*/ }
}
public class FooBuilder {
int a,b,c,d,e;
FooBuilder A(int a) { this.a=a; return this;}
FooBuilder B(int b) { this.b=b; return this;}
//etc
Foo create(){ return new Foo(a,b,c,d,e);
}
如果这不起作用,我会建议寻找AOP。 我将标记必须具有init()的方法的注释(可能是@requires('init')等),并让您的AOP框架插入正确的代码。 要小心多个init没有副作用,或者在has_init_been_called状态下做适当的同步。
只需在foo()的开头调用Init()?
链接地址: http://www.djcxy.com/p/68257.html