Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 丢失代理类的类自定义注释_Java_Proxy_Seam - Fatal编程技术网

Java 丢失代理类的类自定义注释

Java 丢失代理类的类自定义注释,java,proxy,seam,Java,Proxy,Seam,我正在使用Seam使用@In注释将bean注入到我的控制器中。注入类具有自定义注释,当调用injectedClass.getClass()时,getAnnotation(annotationClass)返回null 调试时,我发现Seam传递了一个代理实例,因此getClass()返回InjectedClass_$$\uJavassist\uSeam\u5,它没有我的自定义注释 如何从代理类获取自定义注释 我的课程是这样的: @CustomAnnotation(value="myvalue")

我正在使用Seam使用@In注释将bean注入到我的控制器中。注入类具有自定义注释,当调用injectedClass.getClass()时,getAnnotation(annotationClass)返回null

调试时,我发现Seam传递了一个代理实例,因此getClass()返回InjectedClass_$$\uJavassist\uSeam\u5,它没有我的自定义注释

如何从代理类获取自定义注释

我的课程是这样的:

@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喷射。但这条规则有一个例外:当您调用内部方法时,它不起作用

所以试试这个代码

@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。如果你有一颗像这样的豆子

@Name("myBean")
public class MyBean {

}
它的Componet定义存储在属性myBean.component中

因此,在您的方法中,您可以使用

Component myBeanComponentDefinition = (Component) Context.getApplicationContext().get("myBean.component");
现在你可以打电话了

myBeanComponentDefinition.getBeanClass().getAnnotation(CustomAnnotation.class);
关于,

如果您想要更少的“ComponentDefinition”overbloat,您也可以使用它,它也适用于CDI和Spring:

Class.forName(myBean.getClass().getCanonicalName().substring(0,myBean.getClass().getCanonicalName().indexOf("$"))).getAnnotation(MyAnnotation.class)

如果你能发布你注入类的源代码的相关部分,这将非常有帮助sample@Noura添加到原始答案谢谢你的回复,但它不起作用。我为MyAnnotatedClass使用了一个包装器,该包装器具有@Name annotation而不是MyAnnotatedClass。现在控制器注入了包装器,并调用wrapper.getMyAnnotatedClass().getAnnotation(annotationClass)我认为这是一个丑陋的解决方案,但它解决了这个问题,直到我们有一个更好的解决方案。是的,这得到了注释。我还可以使用myAnnotatedClass.getSuperClass().getAnnotation(CustomAnnotation.class)获取注释,但我无法通过反射获取字段。我迭代myAnnotatedClass.getSuperClass().getClass().getDeclaredFields()。然后调用field.get(myAnnotatedClass),当传递代理对象时抛出异常。