------- android培训、java培训、期待与您交流! ----------
枚举, 内省 BeanUtils工具包
枚举
import
可以导入包,包中类,类中的静态方法。
可变参数,(int ...arg)
overload重载 vs override覆盖
VariableParameter
高级for循环
对集合数据通过迭代进行循环
自动装箱拆箱
Integer iobj = 3;
把int3装箱成Integer对象;
System.out.println(iobj+12);
把Integer对象转成int;
Integer-128到127享元模式为同一个对象。
枚举
枚举就是要让一个类型的变量取值就固定在范围中的一个,否则就会编译错误。
枚举可以让编译器在编译时就可以控制源程序中填写的非法值,普通变量的方式在开发阶段无法实现这一目标。
用普通类来实现枚举功能过程
私有构造方法。
每个元素分别用一个公有的静态成员变量表示。
可以有若干公有方法或抽象方法。
抽象方法的枚举是类中有抽象函数,由元素对象通过内部类来实现。
构造方法通过元素对象指定参数来实现。
public class EnumTest
{
public static void main(String[] args)
{
WeekDay weekDay = WeekDay.SUN;
System.out.println(weekDay.nextDay());
}
}
class WeekDay
{
private WeekDay(){}
/*
public final static WeekDay SUN = new WeekDay(){
public WeekDay nextDay()
{
return MON;
}
};
* */
public final static WeekDay SUN = new WeekDay();
public final static WeekDay MON = new WeekDay();
public final static WeekDay TUE = new WeekDay();
public final static WeekDay WED = new WeekDay();
public final static WeekDay THU = new WeekDay();
public final static WeekDay FRI = new WeekDay();
public final static WeekDay SAT = new WeekDay();
public WeekDay nextDay()
{
if(this == SUN)
{
return MON;
}
else if(this == MON)
{
return TUE;
}
else if(this == TUE)
{
return WED;
}
else if(this == WED)
{
return THU;
}
else if(this == THU)
{
return FRI;
}
else if(this == FRI)
{
return SAT;
}
else
{
return SUN;
}
}
public String toString()
{
if(this == SUN)
{
return "SUN";
}
else if(this == MON)
{
return "MON";
}
else if(this == TUE)
{
return "TUE";
}
else if(this == WED)
{
return "WED";
}
else if(this == THU)
{
return "THU";
}
else if(this == FRI)
{
return "FRI";
}
else
{
return "SAT";
}
}
}
枚举方法
name()
ordinal()等于角标位置
valueOf("SUN").tuString()
values().length//7
枚举只有一个元素时,可以做为一种单例的实现方式。
public enum WeekDay
{
SUN,MON,TUE,WED,THU,FRI,SAT;//有构造方法要私有,元素最后加;
//SUN(1),MON(), 用的指定构造函数
private WeekDay(){}
private WeekDay(int day){}
}
抽象方法的枚举是类中有抽象函数,由元素对象通过内部类来实现。
构造方法通过元素对象指定参数来实现。
public enum TrafficLamp
{
RED(30)
{
public TrafficLamp nextLamp()
{
return GREEN;
}
},
GREEN(45)
{
public TrafficLamp nextLamp()
{
return YELLOW;
}
},
YELLOW(5)
{
public TrafficLamp nextLamp()
{
return RED;
}
};
public abstract TrafficLamp nextLamp(); //
private int time;
private TrafficLamp(int time)//构造方法通过元素对象指定参数来实现
{
this.time = time;
}
}
内省(Introspector):
主要对javaBean进行操作。
javaBean:是特殊的java类,类中的方法的名称以get或set打头的类。
可以将javaBean当初普通的类来操作,但是不可以将普通类当javaBean来操作。
一个类被当做javaBean使用时,javaBean的属性根据方法名推断出来,去掉set或者get前缀,剩余部分就是属性名,如果剩余部分的第二个字母是小写的,则把剩余部分的首字母改成小的。全大写就不变。
在Java EE开发中,经常要使用到JavaBean。很多环境就要求按JavaBean方式进行操作。
JDK中提供了对JavaBean进行操作的一些API,这套API就称为内省,用内省这套API操作JavaBean比用普通类的方式更方便。
对javaBean简单的内省操作:使用PropertyDescriptor类
PropertyDescriptor pd = new PropertyDescriptor(propertyName, beanClass);
pd对象上有getReadMethod()和getWriteMethod()返回一个Method,然后可以通过反射使用此方法。
对javaBean的复杂内省操作:使用BeanInfo接口
BeanInfo是接口,所以不能直接new对象,需要通过Introspector的静态方法getBeanInfo()方法来获得
BeanInfo beanInfo = Introspector.getBeanInfo(beanClass);
beanInfo里面提供了getPropertyDescriptors()方法,返回PropertyDescriptor集合。
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntroSpector
{
public static void main(String[] args) throws Exception
{
ReflectPoint pt1 = new ReflectPoint(3, 5);
String propertyName = "x";
PropertyDescriptor pd = new PropertyDescriptor (propertyName, pt1.getClass());
Method methodGetX1 = pd.getReadMethod();
Object retVal1 = methodGetX1.invoke(pt1);
System.out.println(retVal1);
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1, 7);
System.out.println(pt1.getX());
//内省的复杂操作方法
BeanInfo beanInfo = Introspector.
getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor pd1 : pds)
{
if(pd1.getName().equals(propertyName))
{
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
System.out.println(retVal);
}
}
BeanUtils工具包的运用:
使用需要在工程下加入jar包,步骤如下:
1.在当前工程上右键New-->Folder(这个文件夹的名字以lib为好,阅读性强)
2.将jar包粘贴到lib目录下
3.将jar包加入到Build Path(jar包上右键选Build Path --》add to Build Path)
图标变成小奶瓶就成功了
方法:BeanUtils中的常用方法。
BeanUtils.getProperty(Object pbj,String PropertyName)
BeanUtils.setProperty(Object pbj,String PropertyName,Object value)
BeanUtils处理属性的时候是以字符串的方式来处理的。设值或者取值都是以字符串来处理的。
------- android培训 、 java培训 、期待与您交流! ----------