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);
}
}
大盘预测
国富论
posted on 2007-06-28 15:26
华梦行 阅读(658)
评论(0) 编辑 收藏