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
黑咖啡 阅读(4041)
评论(1) 编辑 收藏 所属分类:
Tec Article