在java程序中每一个类都有一个Class对象,被保存在同名的.Class对象当中,JVM会使用类加载器加载Class文件生成类的对象信息.
当我们创建一个类的对象或者调用这个对象的静态方法,jvm会自动加载类的对象信息
获得类的对象信息
我们一般常用用两种方式获得类的对象信息.
1. 我们可以用Class.forName()方法动态的根据类名获得一个类的Class对象.
1: /**
2: * 使用此方法为自动初始化静态变量和执行static块的代码
3: * 如果找不到对象会抛出一个ClassNotFoundException
4: */
5: Class second = Class.forName("classLoad.Second");
2. 我们还可以用Class class = ClassName.class 来直接获取一个类的类型信息,但用它和Class.forName()获取类的对象
引用信息在静态块时的执行时间上不同,看下面的例子:
一个普通类信息
1: interface Interface{
2: public static String interFlag = "接口";
3:
4: }
5:
6: class Parent implements Interface{
7: public static String parntFLAG = "父类静态变量";
8: static{
9: final String flag2 = "flag2";//static 区中只能用final修饰
10: System.out.println("我在父类静态区里面!"+parntFLAG);
11: }
12:
13: public Parent(){
14: System.out.println("我在父类构造函数里面!");
15: }
16: }
17:
18:
19: class Son extends Parent{
20: public static String sonFLAG = "子类类静态变量";
21: static{
22: System.out.println("我在子类静态区里面!"+sonFLAG);
23: }
24:
25: public Son(){
26: System.out.println("我在子类构造函数里面!");
27: }
28: }
1: interface Interface{
2: public static String interFlag = "接口";
3:
4: }
5:
6: class Parent implements Interface{
7: public static String parntFLAG = "父类静态变量";
8: static{
9: final String flag2 = "flag2";//static 区中只能用final修饰
10: System.out.println("我在父类静态区里面!"+parntFLAG);
11: }
12:
13: public Parent(){
14: System.out.println("我在父类构造函数里面!");
15: }
16: }
17:
18:
19: class Son extends Parent{
20: public static String sonFLAG = "子类类静态变量";
21: static{
22: System.out.println("我在子类静态区里面!"+sonFLAG);
23: }
24:
25: public Son(){
26: System.out.println("我在子类构造函数里面!");
27: }
28: }
使用这种方法引用类的对象不会始化静态变量和执行静态块信息,这些代码方法会在首次引用时执行.
如下引用父类的静态变量,不会执行子类的静态块.
1: public class ClassLoad {
2: public static void main(String[] args) throws ClassNotFoundException {
3:
4: //Son son = new Son();
5: /**
6: * 我们使用一个类的时候需要进行以下3项工作.
7: * 1.加载,
8: * 2.链接
9: * 3.初始化,此步会初始化静态变量和执行静态块信息,但是这种方法会在
10: * 真正调用方法时执行
11: */
12: Class son = Son.class;
13: System.out.println("静态区的初始化会在调用时执行!");
14: // parntFLAG 是父类的静态变量
15: // 此处只会执行父类的静态快
16: System.out.println(Son.parntFLAG);
17:
18: /**
19: * 运行结果
20: *静态区的初始化会在调用时执行!
21: *我在父类静态区里面!父类静态变量
22: *父类静态变量
23: */
24: }
25: }
打印子类的静态变量,所有的代码都会执行
1:
2: public class ClassLoad {
3: public static void main(String[] args) throws ClassNotFoundException {
4:
5: //Son son = new Son();
6: /**
7: * 我们使用一个类的时候需要进行以下3项工作.
8: * 1.加载,
9: * 2.链接
10: * 3.初始化,此步会初始化静态变量和执行静态块信息,但是这种方法会在
11: * 真正调用方法时执行
12: */
13: Class son = Son.class;
14: System.out.println("静态区的初始化会在调用时执行!");
15: // parntFLAG 是父类的静态变量
16: // 此处只会执行父类的静态快
17: System.out.println(Son.sonFLAG);
18:
19: /**
20: * 运行结果
21: * 静态区的初始化会在调用时执行!
22: * 我在父类静态区里面!父类静态变量
23: * 我在子类静态区里面!子类类静态变量
24: * 子类类静态变量
25: */
26: }
27: }
但是使用Class.forName 类加载时就会完成初始化工作.
1: public class ClassLoad {
2: public static void main(String[] args) throws Exception {
3: /**
4: * 使用Class.forName会自动加载所有静态区的信息
5: */
6: Class son = Class.forName("classLoad.Son");
7: Son instance = (Son)son.newInstance();
8: /*
9: * 执行结果
10: * 我在父类静态区里面!父类静态变量
11: * 我在子类静态区里面!子类类静态变量
12: * 我在父类构造函数里面!
13: * 我在子类构造函数里面!
14: */
15:
16: }
17: }
posted @
2011-03-13 18:41 小晖 阅读(875) |
评论 (0) |
编辑 收藏
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
这个是什么,就是解决一个线程内共享一个变量,这个变量只在这个线程内部有效,在一个线程内访问的都一个同一个对象,而多个线程之间的这个对象却是相互独立的。说来就是每一个线程都有一个独立的此线程副本。
使用ThreadLocal一般都声明为静态的变量
在我们的线程中有一个threadLocals的Hash表来存放这个对象,我们用ThreadLocal对象作为主键,因此我们的ThreadLocal对象声明为静态的
我们可以使用多个TheadLocal,来使一个线程里有多个共享的变量
这个就是要实现一个线程里面共享一个变量
public void set(Object value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}
posted @
2009-05-14 21:03 小晖 阅读(194) |
评论 (0) |
编辑 收藏
1. 添加带有数据值 (< 次数秒 >) ReceiveTimeout DWORD 值 *: 在以下注册表项中
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings
例如, 如果希望超时期间将 8 分钟, ReceiveTimeout 数据值设置为 480000 (< 480 > 1000) 。
2. 重新启动计算机。
详情
posted @
2009-05-14 20:56 小晖 阅读(1065) |
评论 (0) |
编辑 收藏
LiveJournal Tags:
pb c 参数对应 MICROSOFT PB(16Bit) PB(32Bit)
Bool Boolean Boolean
Char* Ref string Ref String
Colorref Uint Ulong
Dword Uint Ulong
Handle Uint Ulong
Hdc Uint Ulong
Hfile Uint Ulong
Hinstance Uint Ulong
Hwnd Uint Ulong
Int Int Int
Lparam Uint Ulong
Lpbyte Ref Int Ref Long
Lpdword Ref Uint Ref Ulong
Lpfiletime Ref Time Ref Time
Lpint Ref Int Ref Long
Lpstr,Lpststr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Mcierror Long Long
Lpstr,Lpststr Ref String Ref String
Lpvoid Ref Structstruct_inst Ref Struct struct_inst
Pbyte Ref Int[#] Ref Long[#]
Short Int Int
Structure Ref Struct struct_inst Ref Struct Struct_inst
Uint Uint Uint
Void** SUBROUTINE SUBROUTINE
Word Int Ulong
pb能使用的必须是标准winapi即pasical 压栈顺序
- 制作dll文件时 需要stdcal
- 在函数中加入winapi
eg:
DLLIMPORT WINAPI int CI_MACForPb(
long nFunction,
unsigned char *pEntity,
unsigned char *pInData,
unsigned long nInLength,
unsigned char *pMAC,
unsigned long *pnMACLength
)
posted @
2009-05-14 20:48 小晖 阅读(1741) |
评论 (0) |
编辑 收藏