我有一个接口 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
答案 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