AnnotationProcessor
???? Annotation 處理的接口,實現類是DefaltAnnotationProcessor?:
protected static?void
|
lookupFieldResource
(javax.naming.Context?context, java.lang.Object?instance, java.lang.reflect.Field?field, java.lang.String?name)
??????????Inject resources in specified field. |
protected static?void
|
lookupMethodResource
(javax.naming.Context?context, java.lang.Object?instance, java.lang.reflect.Method?method, java.lang.String?name)
??????????Inject resources in specified method. |
?void
|
postConstruct
(java.lang.Object?instance)
??????????Call postConstruct method on the specified instance. |
?void
|
preDestroy
(java.lang.Object?instance)
??????????Call preDestroy method on the specified instance. |
?void
|
processAnnotations
(java.lang.Object?instance)
??????????Inject resources in specified instance |
public class DefaultAnnotationProcessor implements AnnotationProcessor {
???
??? protected javax.naming.Context context = null;
???
??? public DefaultAnnotationProcessor(javax.naming.Context context) {
??????? this.context = context;
??? }
??? /**
???? * Call postConstruct method on the specified instance.
???? */
??? public void postConstruct(Object instance)
??????? throws IllegalAccessException, InvocationTargetException {
???????
??????? Method[] methods = instance.getClass().getDeclaredMethods();
??????? Method postConstruct = null;
??????? for (int i = 0; i < methods.length; i++) {
??????????? if (methods[i].isAnnotationPresent(PostConstruct.class)) {
??????????????? if ((postConstruct != null)
??????????????????????? || (methods[i].getParameterTypes().length != 0)
??????????????????????? || (Modifier.isStatic(methods[i].getModifiers()))
??????????????????????? || (methods[i].getExceptionTypes().length > 0)
??????????????????????? || (!methods[i].getReturnType().getName().equals("void"))) {
??????????????????? throw new IllegalArgumentException("Invalid PostConstruct annotation");
??????????????? }
??????????????? postConstruct = methods[i];
??????????? }
??????? }
??????? // At the end the postconstruct annotated
??????? // method is invoked
??????? if (postConstruct != null) {
??????????? boolean accessibility = postConstruct.isAccessible();
??????????? postConstruct.setAccessible(true);
??????????? postConstruct.invoke(instance);
??????????? postConstruct.setAccessible(accessibility);
??????? }
???????
??? }
???
???
??? /**
???? * Call preDestroy method on the specified instance.
???? */
??? public void preDestroy(Object instance)
??????? throws IllegalAccessException, InvocationTargetException {
???????
??????? Method[] methods = instance.getClass().getDeclaredMethods();
??????? Method preDestroy = null;
??????? for (int i = 0; i < methods.length; i++) {
??????????? if (methods[i].isAnnotationPresent(PreDestroy.class)) {
??????????????? if ((preDestroy != null)
??????????????????????? || (methods[i].getParameterTypes().length != 0)
??????????????????????? || (Modifier.isStatic(methods[i].getModifiers()))
??????????????????????? || (methods[i].getExceptionTypes().length > 0)
??????????????????????? || (!methods[i].getReturnType().getName().equals("void"))) {
??????????????????? throw new IllegalArgumentException("Invalid PreDestroy annotation");
??????????????? }
??????????????? preDestroy = methods[i];
??????????? }
??????? }
??????? // At the end the postconstruct annotated
??????? // method is invoked
??????? if (preDestroy != null) {
??????????? boolean accessibility = preDestroy.isAccessible();
??????????? preDestroy.setAccessible(true);
??????????? preDestroy.invoke(instance);
??????????? preDestroy.setAccessible(accessibility);
??????? }
???????
??? }
???
???
??? /**
???? * Inject resources in specified instance.
???? */
??? public void processAnnotations(Object instance)
??????? throws IllegalAccessException, InvocationTargetException, NamingException {
???????
??????? if (context == null) {
??????????? // No resource injection
??????????? return;
??????? }
???????
??????? // Initialize fields annotations
??????? Field[] fields = instance.getClass().getDeclaredFields();
??????? for (int i = 0; i < fields.length; i++) {
??????????? if (fields[i].isAnnotationPresent(Resource.class)) {
??????????????? Resource annotation = (Resource) fields[i].getAnnotation(Resource.class);
??????????????? lookupFieldResource(context, instance, fields[i], annotation.name());
??????????? }
??????????? if (fields[i].isAnnotationPresent(EJB.class)) {
??????????????? EJB annotation = (EJB) fields[i].getAnnotation(EJB.class);
??????????????? lookupFieldResource(context, instance, fields[i], annotation.name());
??????????? }
??????????? if (fields[i].isAnnotationPresent(WebServiceRef.class)) {
??????????????? WebServiceRef annotation =
??????????????????? (WebServiceRef) fields[i].getAnnotation(WebServiceRef.class);
??????????????? lookupFieldResource(context, instance, fields[i], annotation.name());
??????????? }
??????????? if (fields[i].isAnnotationPresent(PersistenceContext.class)) {
??????????????? PersistenceContext annotation =
??????????????????? (PersistenceContext) fields[i].getAnnotation(PersistenceContext.class);
??????????????? lookupFieldResource(context, instance, fields[i], annotation.name());
??????????? }
??????????? if (fields[i].isAnnotationPresent(PersistenceUnit.class)) {
??????????????? PersistenceUnit annotation =
??????????????????? (PersistenceUnit) fields[i].getAnnotation(PersistenceUnit.class);
??????????????? lookupFieldResource(context, instance, fields[i], annotation.name());
??????????? }
??????? }
???????
??????? // Initialize methods annotations
??????? Method[] methods = instance.getClass().getDeclaredMethods();
??????? for (int i = 0; i < methods.length; i++) {
??????????? if (methods[i].isAnnotationPresent(Resource.class)) {
??????????????? Resource annotation = (Resource) methods[i].getAnnotation(Resource.class);
??????????????? lookupMethodResource(context, instance, methods[i], annotation.name());
??????????? }
??????????? if (methods[i].isAnnotationPresent(EJB.class)) {
??????????????? EJB annotation = (EJB) methods[i].getAnnotation(EJB.class);
??????????????? lookupMethodResource(context, instance, methods[i], annotation.name());
??????????? }
??????????? if (methods[i].isAnnotationPresent(WebServiceRef.class)) {
??????????????? WebServiceRef annotation =
??????????????????? (WebServiceRef) methods[i].getAnnotation(WebServiceRef.class);
??????????????? lookupMethodResource(context, instance, methods[i], annotation.name());
??????????? }
??????????? if (methods[i].isAnnotationPresent(PersistenceContext.class)) {
??????????????? PersistenceContext annotation =
??????????????????? (PersistenceContext) methods[i].getAnnotation(PersistenceContext.class);
??????????????? lookupMethodResource(context, instance, methods[i], annotation.name());
??????????? }
??????????? if (methods[i].isAnnotationPresent(PersistenceUnit.class)) {
??????????????? PersistenceUnit annotation =
??????????????????? (PersistenceUnit) methods[i].getAnnotation(PersistenceUnit.class);
??????????????? lookupMethodResource(context, instance, methods[i], annotation.name());
??????????? }
??????? }
??? }
???
???
??? /**
???? * Inject resources in specified field.
???? */
??? protected static void lookupFieldResource(javax.naming.Context context,
??????????? Object instance, Field field, String name)
??????? throws NamingException, IllegalAccessException {
???
??????? Object lookedupResource = null;
??????? boolean accessibility = false;
???????
??????? if ((name != null) &&
??????????????? (name.length() > 0)) {
??????????? lookedupResource = context.lookup(name);
??????? } else {
??????????? lookedupResource = context.lookup(instance.getClass().getName() + "/" + field.getName());
??????? }
???????
??????? accessibility = field.isAccessible();
??????? field.setAccessible(true);
??????? field.set(instance, lookedupResource);
??????? field.setAccessible(accessibility);
??? }
??? /**
???? * Inject resources in specified method.
???? */
??? protected static void lookupMethodResource(javax.naming.Context context,
??????????? Object instance, Method method, String name)
??????? throws NamingException, IllegalAccessException, InvocationTargetException {
???????
??????? if (!method.getName().startsWith("set")
??????????????? || method.getParameterTypes().length != 1
??????????????? || !method.getReturnType().getName().equals("void")) {
??????????? throw new IllegalArgumentException("Invalid method resource injection annotation");
??????? }
???????
??????? Object lookedupResource = null;
??????? boolean accessibility = false;
???????
??????? if ((name != null) &&
??????????????? (name.length() > 0)) {
??????????? lookedupResource = context.lookup(name);
??????? } else {
??????????? lookedupResource =
??????????????? context.lookup(instance.getClass().getName() + "/" + method.getName().substring(3));
??????? }
???????
??????? accessibility = method.isAccessible();
??????? method.setAccessible(true);
??????? method.invoke(instance, lookedupResource);
??????? method.setAccessible(accessibility);
??? }
???
}
大盤預測 國富論