9910

          單飛

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          不同classloader加載的class造成isAnnotationPresent失效

          @ComponentClass
          public class Home {
          }
          Class clazz = loader.loadClass("Home");??? //loader 和現在運行的classLoader不是相同的。
          flag = clazz.isAnnotationPresent(ComponentClass.class);//返回false
          原因:
          Class.clss
          ?public boolean isAnnotationPresent(
          ??????? Class<? extends Annotation> annotationClass) {
          ??????? if (annotationClass == null)
          ??????????? throw new NullPointerException();

          ??????? return getAnnotation(annotationClass) != null;
          ??? }


          public <A extends Annotation> A getAnnotation(Class<A> annotationClass) {
          ??????? if (annotationClass == null)
          ??????????? throw new NullPointerException();

          ??????? initAnnotationsIfNecessary();
          ??????? return (A) annotations.get(annotationClass);
          ??? }
          private transient Map<Class, Annotation> annotations;

          而不同的ClassLoader 加載的ComponentClass不是同一個對象,所以用Class作為id不合適,應該使用String。
          解決辦法:

          ComponentClass.class也使用loader加載這樣才能保證一致性。
          banq詳細的解答了這個問題:
          http://www.jdon.com/jive/article.jsp?forum=91&thread=15456

          Classloader存在下面問題:
          在一個JVM中可能存在多個ClassLoader,每個ClassLoader擁有自己的 NameSpace。一個ClassLoader只能擁有一個class對象類型的實例,但是不同的ClassLoader可能擁有相同的class對象 實例,這時可能產生致命的問題。如ClassLoaderA,裝載了類A的類型實例A1,而ClassLoaderB,也裝載了類A的對象實例A2。邏輯 上講A1=A2,但是由于A1和A2來自于不同的ClassLoader,它們實際上是完全不同的,如果A中定義了一個靜態變量c,則c在不同的 ClassLoader中的值是不同的。

          Thread{
          ??? ??? ??? ClassLoader cl = Thread.currentThread().getContextClassLoader();
          ??? ??? ??? URL[] urls = ...
          ??? ??? ??? ClassLoader ncl = new URLClassLoader(urls, cl);//構造新的
          ??? ??? ??? Thread.currentThread().setContextClassLoader(ncl);
          ??? ??? ??? do do do do;
          ??? ??? ??? Thread.currentThread().setContextClassLoader(cl);//執行完恢復
          }
          posted on 2006-12-20 20:35 單飛 閱讀(481) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 革吉县| 丹东市| 淮北市| 原平市| 嘉祥县| 离岛区| 丹东市| 抚宁县| 东至县| 新平| 枞阳县| 北票市| 洛南县| 读书| 西林县| 桐梓县| 德兴市| 德清县| 旅游| 大港区| 谷城县| 南部县| 得荣县| 东明县| 博野县| 湘乡市| 岳阳市| 黄梅县| 陕西省| 陵川县| 安岳县| 安国市| 威远县| 梨树县| 长汀县| 鹤岗市| 宜黄县| 宜州市| 运城市| 凤庆县| 浠水县|