posts - 11,  comments - 0,  trackbacks - 0

 

在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:

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

 

LiveJournal Tags:

 

Catch0 

pb能使用的必须是标准winapi即pasical 压栈顺序

  1. 制作dll文件时 需要stdcal
  2. 在函数中加入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)编辑 收藏

<2009年5月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔档案

文章分类

相册

最新随笔

搜索

  •  

最新评论

阅读排行榜

评论排行榜