Because the set of annotations is well defined, I won't if you could use an 
actual real implementation instead of a proxy. That's mor work but this will be 
much faster as we would not need to build the proxy. 
Alternatively, I wonder if we could cache the serialized proxy somewhere or 
even build it at compile time and bundle it in the jar. 

Emmanuel

On 4 oct. 2012, at 09:01, Łukasz Antoniak <lukasz.anton...@gmail.com> wrote:

> Hello Team,
> 
> In Envers code we use ReflactionManager and XProperty#getAnnotation(Class<T>) 
> quite often. While working on metamodel branch, I 
> have started replacing all those calls with 
> JandexHelper#getValue(AnnotationInstance, String, Class<T>) method. The code 
> became 
> less type safe and grew in size. The only solution that comes to my mind is 
> to create annotation proxy that directs calls to 
> underlying AnnotationInstance. Something like:
> public static <T> T createAnnotationProxy(final AnnotationInstance 
> annotationInstance, final Class<T> annotation) {
>    try {
>        final ProxyFactory proxyFactory = new ProxyFactory();
>        proxyFactory.setInterfaces( new Class[] { 
> annotation.getClassLoader().loadClass( annotation.getName() ) } );
>        final Class proxyClass = proxyFactory.createClass();
>        final ProxyObject proxyObject = (ProxyObject) proxyClass.newInstance();
>        proxyObject.setHandler( new MethodHandler() {
>            @Override
>            public Object invoke(Object self, Method thisMethod, Method 
> proceed, Object[] args) throws Throwable {
>                String executedMethodName = thisMethod.getName();
>                if ( "toString".equals( executedMethodName ) ) {
>                    return proxyClass.getName() + "@" + 
> System.identityHashCode( self );
>                }
>                return JandexHelper.getValue( annotationInstance, 
> executedMethodName, Object.class );
>            }
>        } );
>        return (T) proxyObject;
>    }
>    catch ( Exception e ) {
>        throw new HibernateException( e );
>    }
> }
> 
> This allows to:
> Audited audited = createAnnotationProxy( auditedAnnotationInstance, 
> Audited.class );
> ModificationStore modStore = audited.modStore();
> RelationTargetAuditMode relationTarget = audited.targetAuditMode();
> 
> I have initially shown the above implementation to Hardy and we were 
> wondering what you all think of this approach. Of course 
> executing such method increases memory usage and decreases performance, but 
> from design point of view, I can think of situations 
> where it fits.
> 
> Regards,
> Lukasz
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev

_______________________________________________
hibernate-dev mailing list
hibernate-dev@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to