java枚举, 内省

------- 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培训 、期待与您交流! ----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值