gpt4 book ai didi

java - 代理类的丢失类自定义注释

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:29 26 4
gpt4 key购买 nike

我正在使用 Seam 通过 @In 注释将 bean 注入(inject)我的 Controller 。注入(inject)的类有一个自定义注解,调用 injectedClass.getClass().getAnnotation(annotationClass) 时返回 null。

调试时我发现 Seam 传递了一个代理实例,所以 getClass() 返回 InjectedClass_$$_javassist_seam_5,它没有我的自定义注释。

如何从代理类中获取我的自定义注释?

这是我的类(class)的样子:

@CustomAnnotation(value="myvalue")
@Name("myAnnotatedClass")
public class MyAnnotatedClass extends SuperClass {...}

@Scope(ScopeType.SESSION)
@Name("myController")
public class MyController {
@In("#{myAnnotatedClass}")
private MyAnnotatedClass myAnnotatedClass;

public void actionMethod(){
//call another class which call myAnnotatedClass.getClass().getAnnotation(CustomAnnotation.class)
//then do some reflection for MyAnnotatedClass fields
}
}

最佳答案

好问题。

当您使用 Seam 调用方法时,它会被代理拦截。而这个启用@In 或@Out-jection。但是这个规则有一个异常(exception):当你调用内部方法时它不起作用

所以试试这段代码

@Name
public class Service {

@In
private MyAnnotatedClass myAnnotatedClass;


public void myInterceptedMethod() {
// internal method bypass interceptor
// So @In or @Out-jection is not enabled
internalMethod();
}

private void internalMethod() {
System.out.println(myAnnotatedClass.getClass().getAnnotation(annotationClass));
}

}

添加到原始答案

您想从您的 bean 中检索注释。但是,由于方法拦截器,myAnnotatedClass.getClass() 返回一个代理对象,而不是 bean 类本身。

对于每个 bean 类,Seam 创建一个组件定义,其中存储在应用程序上下文中。属性的名称遵循以下模式:组件名称 加上 .component。所以如果你有一个像这样的 bean

@Name("myBean")
public class MyBean {

}

它的Componet定义保存在属性myBean.component

所以在你的方法中,你可以使用

Component myBeanComponentDefinition = (Component) Context.getApplicationContext().get("myBean.component");

现在你可以打电话了

myBeanComponentDefinition.getBeanClass().getAnnotation(CustomAnnotation.class);

问候,

关于java - 代理类的丢失类自定义注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com