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

上一篇: Can Java Annotations help me with this?

下一篇: Adding EJB interceptors with custom annotations