-------android培训、java培训、期待与您交流! ----------
Eclipse模板代码配置
Preference下【Java】>>【Editor】>>【Templates】
try{}finally{}配置示例:
try{
$(line_selection)
}
finally{
$(cursor)
}
静态导入
importstaticjava.lang.Math.max;//导入类下的某个静态方法。
importstaticjava.lang.Math.*;//导入类下的所有静态方法。
可变参数与for循环增强
//可变参数方法
publicstatic int add(int x,int… args){//int b…只能在最后一个。
//方法实现体。
//在方法中以数组的形式来使用args变量。
}
增强for循环。
for(inta : args){
//循环体
}
增强for循环的被迭代集合或数组必须实现Iterable接口,意思是该集合是可迭代的。否则使用增强for会出现编译错误。
基本数据类型的自动拆箱与装箱
Integernum1 = 2;//5.0版本后的jdk自动装箱语法
System.out.println(num1+ 3);// 5.0版本后的jdk自动拆箱语法
对于基本数据类型,自动装箱会将-128~127之间的数据自动缓存起来。
Integer i1 = 12;
Integer i2 = 12;
I1 == i2 ?//true,享元模式(flyweight),一个字节的数据被缓存了。
Integer i1 = 128;
Integer i2 = 128;
I1 == i2 ?//false
享元模式:有很多个小的对象,他们有很多属性相同,把他们变成一个对象。那些不同的属性把他们变成方法的参数称之为外部状态。那些相同的属性称之为这个对象的内部状态。
枚举
枚举原理,使用匿名内部类实现:
package com.test;
public abstract class WeekDay{
private WeekDay() {
}
public static WeekDaySUM = new WeekDay() {
public WeekDaynextDay() {
return MON;
}
};
public static WeekDayMON = new WeekDay() {
@Override
public WeekDaynextDay() {
return SUM;
}
};
public abstract WeekDaynextDay();
@Override
public StringtoString() {
return this == SUM? "SUM" : "MON";
}
}
实现带有构造函数的枚举:
package com.test;
public enum WeekDay {
SUM, MON, TUS,WED, THI,FRI, SAT;
private WeekDay() {
}
private WeekDay(inti) {
}
}
实现带抽象方法的枚举
package com.text.lamp;
public enum TrafficLamp {
RED(30) {
@Override
public TrafficLampnextLamp() {
return GREEN;
}
},
GREEN(45) {
@Override
public TrafficLampnextLamp() {
return YELLOW;
}
},
YELLOW(5) {
@Override
public TrafficLampnextLamp() {
return RED;
}
};
public abstract TrafficLampnextLamp();
private int time;
/**
* 构造方法。
* @param time
*/
private TrafficLamp(inttime) {
this.time = time;
}
}
枚举只有一个成员时,就可以作为一种单例的实现方式。
反射
从jdk1.2以后出现了反射的机制。
Class.forName()方法作用:
返回字节码,加载方式有两种,一种是这份字节码已经加载过待在虚拟机里了直接返回,还有一种是java虚拟机中还没有这份字节码,则用类加载器去加载,把加载进来的字节码缓存在内存中。
1. 对象.getClass();
2. 类名.class;
3. Class.forName(“类全路径限定名”);//Class.forName(“java.lang.String”)
Class对象的isPrimitive()方法判断某个类型是否是基本类型。
int.class == Integer.TYPE;//true, Integer.TYPE返回包装类的基本类型Class对象
只要在源程序中出现的类型,都有各自的Class实例对象。
反射就是把java类中的各种成分映射成相应的java类。
Field类的getFIeld方法只能拿到可见的字段。
getDeclaredField方法可以拿到private字段。
可使用对象setAccessible(true).则可以去到私有成员的值。
Field类小示例:
private static void changeFieldValue() throwsIllegalAccessException {
Useruser = new User();
user.setAge(1002);
user.setUsername("abddeb");
Field[]fields = user.getClass().getDeclaredFields();
for(Field field : fields) {
field.setAccessible(true);
if(field.getType() == String.class) {
StringvalString = (String)field.get(user);
StringnewVal = valString.replace('b', 'a');
field.set(user,newVal);
}
}
System.out.println(user.getAge());
System.err.println(user.getUsername());
}
静态方法反射调用:
methodObj.invoke(null,””);//因为是静态方法不需要对象调用,第一个参数传空。
为了兼容jdk1.4,以数组作为方法参数被反射调用时,不能直接传入对应的一个数组对象(java会自动将数组元素拆开),此时应该对传入的数组对象再打包一次,例如:
class MethodTest{
public static void myMethod(String[] args){
}
}
反射调用:
Method method = MethodTest.class.getMethod(“myMethod”,String[].class);
Method.invoke(null,new Object[]{new String[]{“111”,”222”}});
或者:
Method.invoke(null,(Object){new String[]{“111”,”222”}});
基本类型的一维数组可以被当作Object类型使用,不能当做Object[]类型使用,非基本类型的一维数组,既可以当做Object类型使用,又可以当做Object[]类型使用。
Object[] a = new String[]{};//编译通过。
System.out.println(Arrays.asList(a));
System.out.println(Arrays.asList(newString[]{"2","3"}));
往HashSet添加完数据后,不要对元素中参与hashCode运算的属性进行修改,否则hashCode发生改变,当要删除该元素时将出现无法找到该元素的现象,这是会导致内存泄露的一个情况。
框架与框架要解决的核心问题:框架与工具类有区别,工具类被用户的类调用,而框架则是调用用户提供的类。
使用类加载器加载资源文件:
现有类目录结构如下:工程根路径/bin/com/test/reflect/ReflectTest.java
资源文件路径:工程根路径/bin/com/test/reflect/config.properties
则在ReflectTest.java中调用资源文件有如下几种写法
1. InputStream ips = new FileInputStream("bin/com/test/reflect/config.properties");//使用IO的绝对路径形式。
2. InputStream ips =ReflectTest.class.getResourceAsStream("config.properties");//class直接找资源的方法,当前路径为ReflectTest.java类文件所在路径。
3. InputStream ips =ReflectTest.class.getClassLoader().getResourceAsStream("com/test/reflect/config.properties");//使用类加载器找到classpath路径的方法。推荐并常用的方法。
4. InputStream ips = ReflectTest.class.getResourceAsStream("/com/test/reflect/config.properties");//此方法为相对于根路径的全路径写法。
JavaBean内省
英文:IntroSpector
作用:对JavaBean进行操作。
JavaBean:属性xxx,get方法getXxx(),set方法setXxx();
属性描述符:PropertyDescriptor
StringpropertyName = “x”;
PropertyDescriptorpd = new PropertyDescriptor(propertyName,对象的class);
MethodmethodGetX = pd.getReadMethod();
ObjectretVal = methodGetX.invoke(对象);//调用对象的get方法,返回属性值
MethodmethodSetX = pd.getWriteMethod();
methodSeX.invoke(对象,属性值);//调用对象的set方法,设置属性值
Introspector类的getBeanInfo方法返回BeanInfo对象。
BeanInfo对象的getPropertyDescriptors方法返回属性描述符数组。
BeanUtils工具包
Apache的开源项目;
BeanUtils:会将类型转换为字符串。
PropertyUtils:会得到属性原始的类型。
该工具包可以对属性链式设置值。