您的位置:首页 > 编程语言 > Java开发

java基础加强--要点总结2

2011-03-16 22:02 260 查看
java基础加强

18.
public class ReflectPoint {

public String str1 = "fadfavbd";
public String str2 = "dffgdaavbd";
public String str3 = "ffadfevbd";
@Override
public String toString() {
return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="+ str3 + "]";
}

}
××××××××××××××××××
ReflectPoint rp2 = new ReflectPoint();
Field[] fields = rp2.getClass().getFields();
String strold;
String strnew;
for(Field f : fields) {
if(f.getType()== String.class) {
strold = (String)f.get(rp2);
strnew = strold.replace("a", "b");
f.set(rp2, strnew);

}
}
System.out.println(rp2);


21.

package trafficlights;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class EnumTest {

public static void main(String[] args) throws Exception {
//ReflectTest.main(new String[]{"1111","2222","3333"});
String className = args[0];
Method mainMethod = Class.forName(args[0]).getMethod("main", String[].class);
mainMethod.invoke(null, (Object)new String[]{"1111","2222","3333"});
//invoke在jdk1.4中将第二个参数看作是一个object数组,jdk1.5为了兼

//容,也这样认为了。所以如果我们传递
//的参数是一个数组的时候,应该将该数组包装一下,比如(Object)new String[] {"1111","2222","3333"}
//,或者可以new Object[]{new String[]{"1111","2222","3333"}}.
}
}

class ReflectTest {
public static void main(String[] args) throws Exception {
for(int i=0;i<args.length;i++) {
System.out.println(args[i]);
}
}
}


23.维数相同,类型相同的数组的字节码是相同的。

24.关于HashCode和内存泄漏的问题。如果不想将参数相同的对象存入HashSet,可以重写hashCode方法和equals方法。需要返回相同的hashCode,才能判断对象相等。当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中单独删除当前对象,从而造成内存泄漏。部分代码展示:

InputStream is = new FileInputStream("config.properties");
Properties pp = new Properties();
pp.load(is);
String classname = pp.getProperty("classname");
Collection coll = (Collection)Class.forName

(classname).newInstance();


properties文件如下所示:classname = java.util.HashSet

通过修改properties可以运行不同的类。properties文件应该创建在相应的工程(project)下,否则系统会找不到文件。

26.如果获取配置文件的话也可以使用InputStream is = EnumTest.class.getClassLoader().getResourceAsStream("trafficlights/config.properties");这时的配置文件应存放在classpath中,也就是和class文件存放在一起。当我们在eclipse中将配置文件拖到相应的包中时,系统自动将其复制到class目录中以供调用。路径前不能使用/,也就是说包名trafficlights前面不要加/,否则系统找不到文件。SSH框架都有相应的配置文件,它们内部都使用的是上面的方式(类加载器加载文件)来获取文件,所以配置文件一般都放在classpath中。我们也可以直接跳过类加载器使用类来寻找文件,如果配置文件刚好在该包之下时,就可以像如下表示,只需要输入相对路径即可。InputStream
is = EnumTest.class.getResourceAsStream("config.properties");如果配置文件不在该包中,则应补充路径,如下所示:InputStream is = EnumTest.class.getResourceAsStream("/hello/config.properties");让我不能理解的是,此处的hello前必须有一个/,否则找不到文件,这和上边利用类加载器时互相矛盾,还有待于更深入的学习。

有一种说法,不加/表示项目路径,加/表示根路径,有待进一步核实。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: