posts - 78,  comments - 48,  trackbacks - 0
          ??1 public ? class ?DrpToOAInfo? {
          ??2 ?@PersistenceContext
          ??3 ?EntityManager?entityManager;
          ??4 ?
          ??5 ? private ? final ? static ?String?CONFIGURETION_FILE? = ? " send_message_zh.properties " ;
          ??6 ? private ? static ?Properties?properties? = ? null ;
          ??7 ?
          ??8 ? public ? static ?Properties?readConfiguretion()
          ??9 ? {
          ?10 ?? if ?(properties? == ? null )
          ?11 ?? {
          ?12 ??? try
          ?13 ??? {
          ?14 ????properties? = ? new ?Properties();
          ?15 ????ClassLoader?cl? = ?Thread.currentThread().getContextClassLoader();
          ?16 ????InputStream?inputStream? = ? null ;
          ?17 ???? if ?(cl? != ? null )
          ?18 ???? {
          ?19 ?????inputStream? = ?cl.getResourceAsStream(CONFIGURETION_FILE);
          ?20 ????}
          ?21 ???? if ?(inputStream? != ? null )
          ?22 ???? {
          ?23 ?????properties.load(inputStream);
          ?24 ?????inputStream.close();
          ?25 ????}
          ?26 ???}
          ?27 ??? catch ?(Exception?e)
          ?28 ??? {
          ?29 ????e.printStackTrace();
          ?30 ???}
          ?31 ??}
          ?32 ?? return ?properties;
          ?33 ?}
          ?34 ?
          ?35 ?
          ?36 ? /**?*/ /**
          ?37 ??*?
          ?38 ??*? @param ?type??接收者類型
          ?39 ??*? @param ?id????接收者id
          ?40 ??*? @param ?name??接收者名稱
          ?41 ??*? @param ?contentVariable??內容中的變動部分
          ?42 ??*? @param ?url?IP地址、端口號、項目
          ?43 ??*? @param ?value?生產計劃單號
          ?44 ??*? @param ?configureInformType?通知類型
          ?45 ?? */
          ?46 ? public ? static ? void ?sendMessage( int ?type,?
          ?47 ???????????????????String?id,?
          ?48 ???????????????????String?name,?
          ?49 ???????????????????Object[]?contentVariable,?
          ?50 ???????????????????String?url,
          ?51 ???????????????????Object[]?value,
          ?52 ???????????????????String?configureInformType)
          ?53 ? {
          ?54 ??String?applictionName? = ? "" ;
          ?55 ??String?content? = ? "" ;
          ?56 ??String?URL? = ? "" ;
          ?57 ??ReceiveType?rt? = ?ReceiveType.DEPARTMENT;
          ?58 ??
          ?59 ?? // 讀取資源文件
          ?60 ??Properties?properties? = ?readConfiguretion();
          ?61 ??applictionName? = ?properties.getProperty( " system.module.appliction.name " );
          ?62 ??content? = ?MessageFormat.format(properties.getProperty(configureInformType),?contentVariable);
          ?63
          ?64 ??URL? = ?url? + ?MessageFormat.format(properties.getProperty(configureInformType? + ? " .url " ),?value);;
          ?65 ??
          ?66 ??
          ?67 ?? if (type? == ? 0 )
          ?68 ?? {
          ?69 ???rt? = ?ReceiveType.PEOPLE;
          ?70 ??}
          ?71 ?? if (type? == ? 1 )
          ?72 ?? {
          ?73 ???rt? = ?ReceiveType.DEPARTMENT;
          ?74 ??}
          ?75 ?? if (type? == ? 2 )
          ?76 ?? {
          ?77 ???rt? = ?ReceiveType.ROLE;
          ?78 ??}
          ?79
          ?80 ??System.out.println( " ****************************************** " );
          ?81 ??System.out.println( " *?類型: " + rt);
          ?82 ??System.out.println( " *?ID: " + id);
          ?83 ??System.out.println( " *?接收者名稱: " + name);
          ?84 ??System.out.println( " *?內容: " + content);
          ?85 ??System.out.println( " *?url: " + URL);
          ?86 ??System.out.println( " ****************************************** " );
          ?87 ????????StartupMessage?sm? = ? new ?StartupMessage(applictionName,?rt, " 117 " ,? " tonywu " ,?id,?name,?content,?URL);
          ?88
          ?89 ??SendMessage?s? = ? new ?SendMessage();?
          ?90 ??s.sendMessage(sm);
          ?91 ?}
          ?92 ?
          ?93 ? /**?*/ /**
          ?94 ??*?從request中得到地址中的參數,
          ?95 ??*? @param ?taskID??接收者類型
          ?96 ??*? @param ?processorID????處理者ID
          ?97 ??*? @param ?processorName??處理者名稱
          ?98 ??*? @param ?processorTime??處理時間
          ?99 ?? */
          100 ? public ? static ? void ?overMessage(String[]?processorInfo)
          101 ? {
          102 // ??讀取資源文件
          103 ??Properties?properties? = ?readConfiguretion();
          104 ??String?applictionName? = ?properties.getProperty( " system.module.appliction.name " );
          105 // ??Calendar?date?=?Calendar.getInstance();
          106 // ??String?t?=?date.get(Calendar.YEAR)+"-"+date.get(Calendar.MONTH)+"-"+date.get(Calendar.DATE);
          107 ??BeOverMessage?bm? = ? new ?BeOverMessage(applictionName,?processorInfo[ 1 ],
          108 ?????????????????????????????????? " 117 " ,? " tonywu " , new ?Date());
          109
          110 ??System.out.println( " ****************************************** " );
          111 ??System.out.println( " *?taskID類型: " + processorInfo[ 1 ]);
          112 ??System.out.println( " *?processorIDID: " + processorInfo[ 2 ]);
          113 ??System.out.println( " *?processorName接收者名稱: " + processorInfo[ 3 ]);
          114 ??System.out.println( " *?時間: " + new ?Date());
          115 ??System.out.println( " ****************************************** " );
          116
          117 ??SendMessage?s? = ? new ?SendMessage();?
          118 ??s.sendMessage(bm);
          119 ?}
          120 }
          121


          幾乎所有的系統都需要通過獲取配置/資源文件來方便配置系統
          但怎樣獲取資源文件呢
          java的應用通常把配置文件和工程中的其他class放在一起(如log4j),原因是可以方便的使用classLoader的 getResourceAsStream()方法獲取資源(其實java內部就是這樣來
          load class的),下面是一個簡單例子:
          比如你把文件(abc.properties)放到com.yourcompany.common包里面,在確保classpath包括該包的情況
          下就可以按下面的方法獲取資源
          ClassLoader cl = this.getClass().getClassLoader();
          InputStream is = cl.getResourceAsStream("com/yourcompany/"+abc.properties)
          進一不,如果abc.properties是一個標準的properties文件的話,比如其內容如下
          messageA = Ok!
          還可以這樣獲取配置信息
          Properties props = new Properties();
          props.load(is);
          String messageA = props.getProperty("messageA ");
          則messageA== "Ok"
          當然properties也可以是XML格式,只要他符合http://java.sun.com/dtd/properties.dtd的規范并且包含
          <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">的DOCTYPE declaration,就可以用props.loadFromXML(InputSteam in)方法載入property
          ps:property 也提供store()和storeToXML方法保存屬性
          關于classLoader也可以看看?

          classloader相關基礎知識
            JVM
            jvm是jre里頭一個動態連接函數庫,jdk里面的jre一般用于運行java本身的程序,比如javac,等等.programfiles下面的jre用于運行用戶編寫的java程序.
            JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了

            當一臺機器上有多個jvm可選擇的時候,jvm的選擇步驟:
            1)當前目錄有沒有jre目錄(不準確),
            2)父目錄下的jre子目錄
            3)注冊表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
            所以當運行的是jdk\bin\java.exe的時候,用的jre是bin的父目錄jdk下面的jre\
            運行java.exe找到了jre后有一個驗證程序,驗證jre和java.exe的版本是否一致,如果不一致則會發生錯誤


            java -verbose:class Main 顯示調用的詳細信息


            classloader的兩種載入方式:1)pre-loading預先載入,載入基礎類 2)load-on-demand按需求載入
            只有實例化一個類才會被classloader載入,僅僅申明并不會載入


            java動態載入class的兩種方式:
            1)implicit隱式,即利用實例化才載入的特性來動態載入class
            2)explicit顯式方式,又分兩種方式:
            1)java.lang.Class的forName()方法
            2)java.lang.ClassLoader的loadClass()方法


            static塊在什么時候執行?
            1)當調用forName(String)載入class時執行,如果調用ClassLoader.loadClass并不會執行.forName(String,false,ClassLoader)時也不會執行.
            2)如果載入Class時沒有執行static塊則在第一次實例化時執行.比如new ,Class.newInstance()操作
            3)static塊僅執行一次



            Class類的實例.
            >>Class類無法手工實例化,當載入任意類的時候自動創建一個該類對應的Class的實例,
            >>某個類的所有實例內部都有一個欄位記錄著該類對應的Class的實例的位置.,
            >>每個java類對應的Class實例可以當作是類在內存中的代理人.所以當要獲得類的信息(如有哪些類變量,有哪些方法)時,都可以讓類對應的Class的實例代勞.java的Reflection機制就大量的使用這種方法來實現
            >>每個java類都是由某個classLoader(ClassLoader的實例)來載入的,因此Class類別的實例中都會有欄位記錄他的ClassLoader的實例,如果該欄位為null,則表示該類別是由bootstrap loader載入的(也稱root laoder),bootstrap loader不是java所寫成,所以沒有實例.

            原生方法:forName0()等方法,native修飾符


            自定義ClassLoader:
            如實例化一個URLClassLoader. URLClassLoader ucl = new URLClassLoader(new URL[]{new URL("file:/e:/bin/")}),URLClassLoader優先找當前目錄,再在url中找.class加載.URL中別忘在最后加"/"表示目錄


            各個java類由哪些classLoader加載?
            1)java類可以通過實例.getClass.getClassLoader()得知
            2)接口由AppClassLoader(System ClassLoader,可以由ClassLoader.getSystemClassLoader()獲得實例)載入
            3)ClassLoader類由bootstrap loader載入


            ClassLoader hierachy:
            jvm建立->初始化動作->產生第一個ClassLoader,即bootstrap loader->bootstrap loader在sum.misc.Launcher類里面的ExtClassLoader,并設定其Parent為null->bootstrap loader載入sun.misc.Launcher$AppClassLoader,并設定其parent為ExtClassLoader(但是AppClassLoader也是由bootstrap loader所載入的)->AppClassLoader載入各個xx.class,xx.class也有可能被ExtclassLoader或者bootstrap loader載入.
            >>自定義的ClassLoader的.getParent()是AppClassLoader.parent和他的加載器并沒有關系
            >>ExtClassLoader和AppClassLoader都是URLClassLoader的子類.AppClassLoader的URL是由系統參數java.class.path取出的字符串決定,而java.class.path由 運行java.exe時 的-cp或-classpath或CLASSPATH環境變量決定
            >>ExtClassLoader查找的url是系統變量java.ext.dirs,java.ext.dirs默認為jdk\jre\lib\ext
            >>Bootstrap loader的查找url是sun.boot.class.path
            >>在程序運行后調用System.setProperty()來改變系統變量并不能改變以上加載的路徑,因為classloader讀取在System.setProperty之前.sun.boot.class.path是在程序中寫死的,完全不能修改

            委派模型
            當classloader有類需要載入時先讓其parent搜尋其搜尋路徑幫忙載入,如果parent找不到,在由自己搜尋自己的搜尋路徑載入,ClassLoader hierachy本來就有這種性質



            NoClassDefFoundError和ClassNotFoundException
            NoClassDefFoundError:當java源文件已編譯成.class文件,但是ClassLoader在運行期間在其搜尋路徑load某個類時,沒有找到.class文件則報這個錯
            ClassNotFoundException:試圖通過一個String變量來創建一個Class類時不成功則拋出這個異常
          posted on 2006-12-08 17:25 黑咖啡 閱讀(4126) 評論(1)  編輯  收藏 所屬分類: Tec Article

          FeedBack:
          # re: 【摘】java中讀取資源文件
          2008-09-02 11:30 | Yvon
          在找相關資料,謝謝博主的分享  回復  更多評論
            

          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          留言簿(2)

          隨筆分類(67)

          文章分類(43)

          Good Article

          Good Blogs

          Open Source

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 根河市| 清镇市| 肇源县| 寿阳县| 名山县| 仲巴县| 汤原县| 抚远县| 井冈山市| 呼玛县| 兰溪市| 扬州市| 喀什市| 九台市| 和田市| 独山县| 大足县| 永福县| 甘南县| 深州市| 泸定县| 宁武县| 德庆县| 龙陵县| 射阳县| 平潭县| 平乐县| 郁南县| 怀化市| 马龙县| 延川县| 新闻| 青海省| 宁国市| 北安市| 金平| 儋州市| 乳山市| 平顺县| 米泉市| 麻城市|