- 修改一个类的成员(变量或方法),一定要测试所有引用该成员的其他类(包括WEB页面)。
- 修改一个类的成员名称(变量或方法),一定要先搜索代码中有没有使用反射。
- 把一个页面设置为不缓存,一定要测试所有使用history.back()或history.go(-1)这样的脚本来返回该页面的页面。
- 在代码中删除一个数据表字段,一定要测试所有使用改数据库字段的类,和使用这些类的类及页面。
- 一定一定要对页面进行全文检索,因为Eclipse等工具的引用检索无法检索到通过标签引用的对象的属性。
1.类成员变量或类实例成员变量在该类被载入的时候被载入。
例:
private ClassA ca = new ClassA();
static ClassB cb = new ClassB();
这里的new是必须的,否则ClassA和ClassB不会被载入。
2.类成员函数或类实例成员函数在反射方法(未调用方法前)时,
如果该方法的返回类型不是void,则返回类型被载入。
3.类成员函数或类实例成员函数在反射方法被调用或直接调用该方法时,
方法中引用的其他类型被载入。
1.建立数组
1 int[] i = {1,2,3};
2 String[] s = {"a","b","c"};
上面的语句确实可以建立数组。看似{1,2,3}可以
独立代表一个数组对象,其实是不可以的,这和String类型的字面值不同,一个String类型的字面值就是一个String类的实例,而一个数组的字面值什么都不是。
2.静态方法或变量的覆盖
1 public class Main {
2
3 public static int i = 10;
4 /**
5 * @param args the command line arguments
6 */
7 public static void main(String[] args) {
8 System.out.println(TTT.i);
9 System.out.println(Main.i);
10 Main m = new Main();
11 System.out.println(m.i);
12 TTT t = new TTT();
13 System.out.println(t.i);
14 Main m2 = new TTT();
15 System.out.println(m2.i);
16 System.out.println(((TTT)m2).i);
17
18 Main.Test();
19 TTT.Test();
20 m.Test();
21 t.Test();
22 m2.Test();
23 ((TTT)m2).Test();
24 }
25
26 public static void Test() {
27 System.out.println("Hello Test From Main.");
28 }
29
30 }
31
32 class TTT extends Main {
33
34 public static int i = 20;
35
36 public static void Test() {
37 System.out.println("Hello Test From TTT.");
38 }
39 }
3.一个接口可以继承多个接口(使用extends关键字)
4.如果一个类中定义了final常量,并且在多个类中被引用,当该常量被修改时(
代码级修改),其他引用该常量的类都要被重新编译,
否则,新值是不会被代入引用该常量的类中。原因是常量在编译期被硬编码到引用它的类中,可以通过反编译工具来验证。
5.一个方法的返回类型必须直接写在方面名称的前面
6.与类名相同的方法名(非构造函数)是被允许的(JDK1.4测试通过,也许1.4之前的版本不能通过)
1 public class Test {
2 Test() {
3
4 }
5
6 public void Test() {
7
8 }
9 }
这两天在研究Log4j的一些用法,无意中发现Log4j提供了一个Log Viewer,名字叫做ChainSaw。
这个工具在Log4j的jar包中,这个工具可以分析xml格式的log文件,同时这个工具可以监听当前
项目发送过来的log。
用法很简单 java -cp ./log4j-1.2.15.jar org.apache.log4j.chainsaw.Main,执行该命令后就会出现
ChainSaw的Swing窗口了。
要想监听当前项目发送过来的Log,需要配置项目里的log4j.properties文件,加入下面一段:
log4j.appender.CHAINSAW_CLIENT=org.apache.log4j.net.SocketAppender
log4j.appender.CHAINSAW_CLIENT.RemoteHost=localhost
log4j.appender.CHAINSAW_CLIENT.Port=4445
log4j.appender.CHAINSAW_CLIENT.LocationInfo=true
在rootLogger中加入CHAINSAW_CLIENT的appender,如:log4j.rootLogger=INFO,CHAINSAW_CLIENT
改工具可以设置多个过滤条件,如级别、线程、Logger、消息等。
更多使用方法可以自己摸索一下,很简单哦。
今天为了解决一个项目问题,跟踪到Log4j的源码里,发现我们以前都写过下面的程序吧:
1if (
log.isDebugEnabled())
2 log.debug("Erro Message");
其实再确认是否Enabled,因为debug、info等方法里面有同样的验证。
所以以后少一段这样的验证也许会提高一些性能。
我测试的Log4j的版本是1.2.9
补充:有些情况下对于这个判断还是很必要的,如log的信息是调用不同的方法的结果组合而成的,并且这些方法执行起来比较费时,这个时候就需要先判断一下。
CSV : Comma Separate Values
CSV 英文文档 : http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
CSV即Comma Separate Values,这种文件格式经常用来作为不同程序之间的数据交互的格式。
具体文件格式 :
- 每条记录占一行
- 以逗号为分隔符
- 逗号前后的空格会被忽略
- 字段中包含有逗号,该字段必须用双引号括起来
- 字段中包含有换行符,该字段必须用双引号括起来
- 字段前后包含有空格,该字段必须用双引号括起来
- 字段中的双引号用两个双引号表示
- 字段中如果有双引号,该字段必须用双引号括起来
- 第一条记录,可以是字段名
看了很多Javascript的书籍,发现对Select可以使用add方法添加Option选项。
selectObj.add(new Option("Label", "Value"));
但是add方法好像只在IE下好用。现在提供一个通用的方法:
selectObj.options[selectObj.length] = new Option("Label", "Value");
另外如果想还想使用add方法,可以写成如下格式:
selectObj.add(new Option("Label", "Value"), null);
请注意,在IE6及IE7下请使用不带null参数的add方法,在FF下请使用带null参数的方法,IE8下带不带都可以。
很奇怪为什么一定要加null,我猜测add方法里一定使用了'=== null'来判断第二的参数或者没有对参数数组的长度做验证。
突然心血来潮想试试C++,本来想用Cygwin,但是它要下载的东西太多了,无奈网络太慢,所以放弃了。
后来转向MinGW,Eclipse和Netbeans生成的Makefile里都使用了类Unix的内部命令,比如cp、mkdir等。
所以在Windows环境下MinGW还不能直接和IDE集成。解决的办法很简单,下载一个MSYS,在MinGW网站上有介绍。
MSYS是一个最小shell环境,提供对类Unix最常用内部命令的支持,在MSYS环境里启动Eclipse或Netbeans,
编译C/C++项目就不会再出什么错误了。