2011-09-22 12 views
13

Soy bastante nuevo en los términos de la anotación. He leído algunas fuentes y he llegado a la conclusión de que no contesté mi pregunta. Tal vez busqué en Google usando la búsqueda incorrecta. Tal vez pase por alto, o quizás soy simplemente despistado ...Anotación Java ejecutar un método dentro de la declaración de anotación (uso para android)

De todos modos aquí está el trato.

Estoy ocupado escribiendo una aplicación que requiere "validación de roles".

Para hacer esto, quiero utilizar una anotación.

Así que algo a lo largo de la línea de:

@interface Validate(){ 

} 

Lo que se pretenden lograr sometihng lo largo de las líneas de:

public @interface Validate() { 
    public Validate() { 
     //Do validation stuff 
    return true/false 
    } 
} 

Así que, básicamente, quiero definir métodos dentro de la anotación. Quiero ser capaz de llamar a

@Validate 
public void methodThatRequiresAdminRole() { 
    doStuff(); 
} 

Solo los administradores deben ser capaces de entrar en este método. De lo contrario, se generará un error.

así que si @validate devuelve true, el método debe ser ejecutado

Lo siento si estoy realmente claro. No estoy muy seguro de cómo preguntar correctamente lo que quiero. Así que espero que los ejemplos cuenten las historias.

Espero leer sugerencias y tal vez incluso una respuesta pronto. Gracias.

** ** EDITAR

Necesito hacer hincapié en el hecho de que el código debe ser utilizado en una aplicación Android. Así que prefiero no utilizar frameworks extraños no destinados para Android. No tengo problemas para agregar una biblioteca personalizada que proporcione la funcionalidad sin ningún tipo de marco de aplicación.

Respuesta

19

Las anotaciones son metadatos. Lo que necesitas escribir es un procesador de anotaciones. Una anotación en sí misma no puede cumplir la lógica de validación. El procesador de anotaciones mirará las anotaciones y luego realizará la validación y controlará el flujo de la aplicación. Esta respuesta SO tiene una buena explicación Can Java Annotations help me with this?

También necesita anotar la anotación con @Retention (RetentionPolicy.RUNTIME) para que la información de la anotación se conserve hasta el tiempo de ejecución.

@Retention(RetentionPolicy.RUNTIME) 
public @interface Validate() { 
}
+0

Gracias por su consejo, así como el enlace. Sé lo que debo hacer para mi próximo paso. Así que me ayudó. –

+0

De nada. Consulte también este enlace para la implementación de un procesador de anotación simple http://www.horstmann.com/corejava/cj7v2ch13ex.pdf. –

0

No creo que pueda lograr esto solo con anotaciones. Están destinados a proporcionar metainformación sobre los elementos del código y no procesar la lógica. Para implementar realmente la restricción en la invocación de métodos anotados, deberá verificar el acceso a mano dentro o fuera del método o inyectar tal control usando algo como http://www.eclipse.org/aspectj/

+0

en caso de que están familiarizados con .NET. Estoy buscando "atributos". Estaba/estoy convencido de que es exactamente lo que es una anotación. ¿Podría estar equivocado en este caso? Solo vino a mi mente. Gracias por su respuesta por cierto. Parece que no se puede lograr. Dejaré pasar unos pocos minutos, veré qué respuestas aparecen. De lo contrario, marcaré esto. –

+0

@Joey AspectJ se puede utilizar para el desarrollo de Android, pero está limitado al uso del tiempo de compilación, lo que significa que solo puedes controlar la ejecución de los métodos para los que tienes el código fuente. – Gandalf

+0

@Joey Sí Las anotaciones Java son equivalentes a los atributos .NET. Puede agregar anotaciones a los métodos y estas anotaciones pueden contener datos, pero no procesar la lógica que se ejecuta en una llamada a un método, por ejemplo. Esta es más la preocupación de un aspecto llamado en los términos de AOP. – Gandalf

2

Nota, esto podría ser bastante fuera de tema.Usando spring AOP con, el procesamiento de las anotaciones es bastante sencillo:

Crear un aspecto:

@Aspect 
public class RoleCheckAspect { 
    @Before("@annotation(your.package.Validate)") 
    public void doAccessCheck() throws Exception { 
    // Do validation stuff 
    if (!valid) 
     throw new IllegalAccessException("foo"); 
    } 
    } 
} 

configurar su aspecto:

En META-INF/aop.xml

<!DOCTYPE aspectj PUBLIC 
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
    <!-- only weave classes in our application-specific packages --> 
    <include within="your.package..*" /> 
    </weaver> 
    <aspects> 
    <!-- weave in just this aspect --> 
    <aspect name="com.bac.bsl.nonproc.TestAspect" /> 
    </aspects> 
</aspectj> 

Puesta en marcha load time weaving

En la primavera Contexto:

<context:load-time-weaver/> 

Asegúrese de que la primavera-agente se inicia con su aplicación:

java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp