隨筆-295  評論-26  文章-1  trackbacks-0

          AnnotationProcessor ???? Annotation 處理的接口,實(shí)現(xiàn)類是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);
          ??? }
          ???

          }



          大盤預(yù)測 國富論
          posted on 2007-06-28 15:26 華夢行 閱讀(662) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 安平县| 武汉市| 盈江县| 遂宁市| 大埔区| 右玉县| 临泽县| 克什克腾旗| 米易县| 双牌县| 鄱阳县| 陇南市| 肃北| 华容县| 来凤县| 清丰县| 河北省| 龙门县| 梅河口市| 新巴尔虎右旗| 青阳县| 昌黎县| 湛江市| 甘肃省| 洮南市| 望奎县| 余干县| 汨罗市| 奉贤区| 固镇县| 萍乡市| 霞浦县| 海盐县| 福州市| 吴江市| 保德县| 阿克陶县| 阿拉尔市| 平塘县| 嘉善县| 威信县|