黑马程序员——java中的枚举和反射初探

本文探讨了Java 5.0版本引入的枚举(enum)特性和反射技术的基础应用。通过对比传统枚举实现方式与现代枚举实现方式,展示了枚举如何简化代码并提高可读性。此外,还介绍了如何利用反射技术获取类的信息及调用其方法。
------- android培训java培训、期待与您交流! ----------  
    JDK5版本加了很多新特性,可以说是java一个革命性的改变,比如说以前被java语言舍弃掉的枚举类型又加入到了java语言中来,下面,本人就以对enum粗浅的认识来做一个归纳和探究。
    没有enum之前其实也可以用普通的类实现枚举,但比较麻烦和不好理解,比如要对一周的周一到周日做个类的描述,可以写一下代码:
package cn.itcast.day1;

public abstract class WeekDay1 {
	private WeekDay1() {
	}

	public final static WeekDay1 SUN = new WeekDay1() {
		public WeekDay1 nextDay() {
			return MON;
		}
	};
	public final static WeekDay1 MON = new WeekDay1() {
		public WeekDay1 nextDay() {
			return SUN;
		}
	};

	public abstract WeekDay1 nextDay();

	public String toString() {
		if (this == SUN) {
			return "SUN";
		} else {
			return "MON";
		}
	}
}


    这里实现了本类的实例对象的下一个对象是谁,只用了MON,SUN两个值来举例说明,如果是多个值则会变得更加复杂,如果用枚举类型来设计的话会变得异常简单。
public enum WeekDay {
	SUN,MON,TUE,WED,THI,FRI,SAT;
	private WeekDay(){
	}
	private WeekDay(int day){}
}


    枚举有点类似于类,可以把它当成一个特殊的类,它里面封装了一些方便,好用的方法对枚举类型的数据操作变得简单了很多。注意:枚举里面的构造方法必须是private 也就是说他不能被直接创建对象。
    枚举里面的成员用逗号隔开,最后一个成员用分号结束。我的理解是里面的成员类似于已经创建好的枚举类的对象,可以通过枚举名的一些方法获取,比如:WeekDay.values()[2],获取成员数组的第二个成员,WeekDay.valueOf("MON") 通过字符串来获取某个成员。也可以通过枚举名获得对象,但不是通过new方法,比如说:WeekDay weekDay=WeekDay.TUE 就获得了一个对象。System.out.println(weekDay)是打印这个枚举对象,System.out.println(weekDay.toString())同上。
    下面写一个交通灯的代码
public enum TrafficLamp {
	RED(30) {
		public TrafficLamp nextLamp() {
			return GREEN;
		}
	},
	GREEN(30) {
		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;
	}
}


    分析:虽然没有类,但枚举成员类似于类中new TrafficLamp()这样的方式来创造对象,所以里面是可以根据构造方法的参数列表情况传入实际参数的,由于方法public abstract TrafficLamp nextLamp() 是一个抽象的方法所以必须实现在创造成员时实现抽象方法。
    反射技术初探。由于对反射技术还没有很深入的了解,所以在这里仅对反射技术做一个简单的探索。
    首先要了解一个叫Class的类,这是特殊的类,因为它创建的对象是一个类(可以理解为字节码),也就是说把类这种事物抽象归纳一下也可以有一些共同的方法和属性的,所以有了一个Class类。一般有三种方式来获取Class对象:1.类名.class,比如说String是一个类,可以通过String.class获得一个对象,它是一段字节码。2.对象.getClass(),比如变量str是String类型的对象,通过str.getClass()获得String类的字节码。3.Class类的静态方法来获取,Class.forName("java.lang.String")来获取类String的字节码。
    通过获取的类的字节码可以有一些方法供我们调用,下面列举一些常用的方法:
    isPrimitive() 是否属于基本类型,如果是那八种基本数据类型则返回true。
    getConstructor(Class<?>... parameterTypes) 返回该类的构造方法。里面是参数列表。举例如下:Constructor<String> c=String.class.getConstructor(StringBuffer.class);
String s= (String)c.newInstance(new StringBuffer("123"));
System.out.println(s.charAt(2));
    getField(String name) 通过参数名返回该类的成员变量。
    getMethod(String name, Class<?>... parameterTypes) 获取类的成员方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值