wasw100's Blog
2012/02/23

Google AD

2009年12月27日

java中static块执行的时间

先放一个引用:http://www.javaeye.com/topic/11003

引用

其实我想事实是这样的:
一个类的运行,JVM做会以下几件事情 1、类装载 2、链接 3、初始化 4、实例化;而初始化阶段做的事情是初始化静态变量和执行静态方法等的工作。所以,当Class.forName(args[0],true,off.getClass().getClassLoader());中的true变为false的时候,就是告诉JVM不需再load class之后进行initial的工作。这样,将initial的工作推迟到了newInstance的时候进行。所以,static块的绝对不是什么“只是在类被第一次实体化的时候才会被仅仅调用一次”,而应该是在类被初始化的时候,仅仅调用一次。

有上面的引用可知,static块在类加载的时候执行,但是什么时候类加载? 首先明确不是在类加载的时候执行,可以像写jdbc的时候:

Class.forName(“com.mysql.jdbc.Driver”);

这样就会加载并初始化程序,但不实例化,具体可以参考:

http://tech.it168.com/j/d/2007-01-09/200701091303176.shtml

jdbc只需加载并初始化,无需实例化。

在javaApi中有:

newInstance 实例化

创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化之。

可见初始化可以在Class.forName(第二个参数为true)的时候进行,或者在第一次实例化的时候,如果没有初始化先初始化。

–EOF–

2009年12月26日

java中try catch finally的执行顺序

直接贴代码

package com.wasw100.test;

public class CatchTest {
	public static void main(String[] args) {
		System.out.println(test());
	}

	public static String test() {
		int i = 0;
		TestData td = new TestData();
		try {
			i=1;
			td.setS("1");
			System.out.println("try块执行 \ti:"+i+" s:"+td.getS());
			Integer.parseInt("a");
			return "正常返回\ti:"+i+" s:"+td.getS();
		} catch (Exception e) {
			i=2;
			td.setS("2");
			System.out.println("catch块执行\ti:"+i+" s:"+td.getS());
			return "catch块返回\ti:"+i+" s:"+td.getS();
		} finally {
			i=3;
			td.setS("3");
			System.out.println("finally块执行\ti:"+i+" s:"+td.getS());
			// return "finally块返回";
		}
	}
}

class TestData{

	private String s;

	public String getS() {
		return s;
	}

	public void setS(String s) {
		this.s = s;
	}

}

执行结果:
try块执行 	i:1 s:1
catch块执行	i:2 s:2
finally块执行	i:3 s:3
catch块返回	i:2 s:2

执行顺序很好理解,但是返回的i、s的值为什么是2,不是3?

一个很不错的解释:http://www.javaeye.com/topic/79092?page=2#284368

总结:

try或者catch执行后,如果有return语句,那么先把返回值copy到栈顶,例如上面的例子会把  “catch块返回\ti:”+i+” s:”+td.getS() 得到的字符串的引用copy到栈顶,也就是说return已经执行,但是还没返回(在MyEclipse的debug模式下可以看的很清楚) 然后执行finally,执行完finally,再把栈顶的值返回。如果返回的是一个对象的引用的话,那么将是finally执行后的值

因为字符串是一个在java中有特殊的对待,所以和普通对象有所不同,字符串是放到字符串常量池的,而换成一个普通对象作为返回值就能够看出来了。

java中的字符串可以看http://b0r0j0.blogbus.com/logs/8213193.html

–EOF–

2009年12月23日

TortoiseSVN的安装和简单使用

下载安装TortoiseSVN:http://cdnetworks-kr-2.dl.sourceforge.net/project/tortoisesvn/Application/1.6.5/TortoiseSVN-1.6.5.16974-win32-svn-1.6.5.msi

1.下载项目

新建一个目录,进入目录,在空白处右击,点击SVN Checkout…

第一个文本框(URL of repository)填写svn的地址,其余默认,如果还没有用户,首先就是输入用户名密码

2.清除原来的用户

想修改用户,首先就是清除原来的用户

右击空白处-》 TortoiseSVN-》settings

选择左侧的saved data, 点右侧界面Authentication data的clear按钮

新用户的创建将按第一个步骤就可以了

3.update,commit

都很简单了,都在对应的目录下点击右键就可以了

4.上传工程
右击工程->import

相关文章: 用MyEclipse和googlecode的svn控制自己的代码

–EOF–

2009年12月22日

mysql更改引擎 (InnoDB,MyISAM)

mysql默认的数据库引擎是MyISAM,不支持事务和外键,也可使用支持事务和外键的InnoDB。

查看当前数据库的所支持的数据库引擎以及默认数据库引擎

show engines;

更改方式1:修改配置文件my.ini

我将my-small.ini另存为my.ini,在[mysqld]最后添加为上default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

更改方式2:在建表的时候指定或者建完表修改

--建表的时候指定
create table mytbl(
	id int primary key,
	name varchar(50)
)type=MyISAM;

--建完表后修改
alter table mytbl2 type = InnoDB;

--查看修改结果(mytest为表所在的database名字)
show table status from mytest;

相关文章:绿色版MySQL的安装和使用

参考文章:Mysql支持事务的InnoDB

–EOF–

2009年12月20日

hsqldb时间使用总结

官方文档:http://hsqldb.org/doc/guide/guide.html

可以查看有关时间的函数(可以搜索datediff,马上就可以转到时间函数那块)

hsqldb中时间可以使用now、CURRENT_TIMESTAMP这样的函数表示,也可以使用字符串,类似'yyyy-MM-dd','yyyy-MM-dd HH:mm:ss.SSS'这样的字符串

例如建一张表,插入一条数据

create table user(
	id INTEGER primary key,
	birthday DATETIME default 'now'
);

插入时间插入可以使用默认值now(无需填写)、或者sql语句中使用函数now(),curdate()之类的 、或者使用'yyyy-MM-dd','yyyy-MM-dd HH:mm:ss.SSS'这样的字符串。

insert into user(id) values(1);
insert into user values(2,now());
insert into user values(3,'2009-12-20');
insert into user values(4,'2009-12-20 20:01:02');
insert into user values(5,'2009-12-20 20:01:02.123');

结果:

1	2009-12-20 23:17:06.211
2	2009-12-20 23:17:06.211
3	2009-12-20 00:00:00.0
4	2009-12-20 20:01:02.0
5	2009-12-20 20:01:02.123

当你向hsqldb中插入某个时间,就可以结合DateFormat、Calendar等类组合出字符串了

–EOF–

2009年12月18日

用Swing显示时间比实际的晚8小时解决方法

参考文章:http://blog.csdn.net/subchen/archive/2008/04/18/2303402.aspx

在main中调用:
System.setProperty(“user. timezone”, “GMT+8″);
不起作用

改为

TimeZone.setDefault(TimeZone.getTimeZone("ETC/GMT-8"));

时间显示正确

–EOF–

2009年12月17日

PL SQL Developer和精简版Oracle客户端安装

用自己的xp连接远程的oracke10g,单独安装个oracle太浪费了。

安装了精简版oracle居然成功了。

步骤:

1.下载oracle精简版:
From: http://x.gd2.xdowns.com:8080/088/oracle9i310.rar
To: C:\Documents and Settings\Administrator\桌面\oracle9i310.rar
Size: 12.2 MB (12,710,213 bytes)
Transferred: 12.2 MB (12,710,213 bytes)

安装后也只有33.4M

2 .安装(D:\Oracle)

3.配置,下面是一个配置文件的参考

打开D:\Oracle\ora90\network\ADMIN下的tnsnames.ora

ORCL_192.168.0.19 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.19)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = orcl)
      (SERVER = DEDICATED)
    )
  )

可能出现的问题:

无法连接远程服务器 报无法处理服务名 的提示

解决方法:

在Path环境变量中找到D:\Oracle\ora90\BIN\; 把位置放在前面,使用sql plus连接ORCL_192.168.0.19成功

在pl sql developer中也能成功

–EOF–

2009年12月7日

用java判断数据库某个表是否存在

ResultSet rs = conn.getMetaData().getTables(null, null, "carpark".toUpperCase(), null);
while(rs.next()){
    System.out.println(rs.getObject(3).toString());
}

主要就是用到getTable方法

前两个参数没研究,直接用null就可以,感兴趣的可以去查查api

第三个参数是表名:null 和“%”都表示所有的表,其中是区分大小写的,必须是大写才可以

第四个参数:types – 要包括的表类型所组成的列表,必须取自从 getTableTypes() 返回的表类型列表;null 表示返回所有类

例如:new String[]{“TABLE”,”VIEW”}

只有在hsqldb中测试通过,其他数据库没有测试

–EOF–

返回顶部