如何在Java中从引用调用方法发送到注释

时间:2018-10-07 17:12:31

标签: java java-8 annotations

我有一个接口 I 和一个抽象类 A ,我有我的自定义批注 MyAnnotation ,该批注应将参数作为子类 A 中的S ,现在在处理注释时,我想调用具体类 S

的方法
public interface I{
   void m1();
}

public abstract class A implements I {
    public abstract void m1();
}

public @interface MyAnnotation {
    public Class< ? extends A> ref();
    public Class< ? super A> ref2();
}

public S extends A{
    public void m1() {}
}

我正在注释

之类的方法
@MyAnnotation(ref= new XX() )  or @MyAnnotation(ref= XX.class )
@MyAnnotation(ref= new yy() ) or @MyAnnotation(ref= yy.class )

以任何可行的方式

//In spring aspect before processing I am getting method annotation and trying to call m1()  
annotation.ref().m1() //Error
annotation.ref2().m1() //Error

2 个答案:

答案 0 :(得分:3)

注释中不能使用new XX()。注释参数可以使用一组非常特定的类型:

  
      
  • 原始
  •   
  • 字符串
  •   
  • 班级
  •   
  • 枚举
  •   
  • 另一个注释
  •   
  • 以上任何一个的数组
  •   

请参见this answer

因此,要完成您要完成的工作,您必须使用一个类。

然后,您将不得不使用反射来创建实例并调用该方法。

Class<?> clazz = annotation.ref();
I instance = (I) cls.getConstructor().newInstance();
instance.m1();

请参见this answer

您的类都必须具有无参数的构造函数,否则您只能以这种方式实例化某些实例,而不能以其他方式实例化(导致您必须有条件地基于该类进行分支)。

答案 1 :(得分:0)

您不能那样简单地做到这一点。您首先需要一个类的实例。 如果您的import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; // ... return this.http.post("http://localhost:3000/user/isAvaliable", { userName: formCtrl.value }).pipe( map((resp: any) => { console.log(resp); status = resp.status; console.log(status); return status === 'success' ? { userExists: true } : null; }) ); 类是A bean,则可以注入Spring's并从那里获取bean。然后您可以调用一个方法。

ApplicationContext