ASP.Net+Android+IOS开发------期待与您交流
<java高新-枚举和反射总结>
Java的Enumeration(枚举):
便是具有这些限制的一个反复器的例子。
除下面这些外,不可再用它做其他任何事情:
(A) 用一个名为elements()的方法要求集合为我们提供一个Enumeration。我们首次调用它的nextElement()时,这个 Enumeration会返回序列中的第一个元素。
(B) 用nextElement()获得下一个对象。
(C) 用hasMoreElements()检查序列中是否还有更多的对象。
“反复器”这个词在C++和OOP的其他地方是经常出现的,所以很难确定为什么Java的开发者采用了这样一个奇怪的名字。Java 1.2的集合库修正了这个问题以及其他许多问题。
枚举其实就相当于一个类,其中也可以有构造方法、成员变量、普通方法和抽象方法。不过那种是属于复杂的枚举。这种枚举,必须将枚举元素放在枚举体的最前面,且要用分号隔开。
下面是对枚举的应用代码实现:
1.用普通类实现枚举:
public abstract class WeekDay {
private WeekDay(){}//私有化构造方法,不允许别人创建对象
public final static WeekDay SUNDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return MONDAY;
}
};
public final static WeekDay MONDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return TUESDAY;
}
};
public final static WeekDay TUESDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return WEDNESDAY;
}
};
public final static WeekDay WEDNESDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return THURSDAY;
}
};
public final static WeekDay THURSDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return FRIDAY;
}
};
public final static WeekDay FRIDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SATURDAY;
}
};
public final static WeekDay SATURDAY = new WeekDay(){
@Override
public WeekDay nextDay() {
// TODO Auto-generated method stub
return SUNDAY;
}
};
//返回下一天的方法
public abstract WeekDay nextDay();
//重写toString()方法,方便输出
public String toString(){
if(this == SUNDAY)
return "SUNDAY" ;
else if(this == MONDAY)
return "MONDAY";
else if(this == TUESDAY)
return "TUESDAY";
else if(this == WEDNESDAY)
return "WEDNESDAY";
else if(this == THURSDAY)
return "THURSDAY";
else if(this == FRIDAY)
return "FRIDAY";
else
return "SATURDAY";
}
}
2.枚举实例
public enum WeekDay{
SUN,MON,TUE,WED,THU,FRI,SAT;
}
4. 反射 reflect
* 反射:程序的运行时期,对一个类的字节码文件(class)进行解剖
解剖后,看到字节码文件中定义的内容 成员方法,成员变量,构造方法
可以运行这个方法,成员变量
* 简单的记:编译时期不知道运行谁,运行时期也不知道运行谁,运行的类和方法,由用户指定
5. 反射相关的东西--类
* java是面向对象的语言,class文件也是对象,有一个类,描述这个class文件的,java.lang.Class
* 构造方法也是一个对象,Constructor类
* 成员方法也是一个对象,Method类
* 成员变量也是一个对象,Filed类
6. 获取到一个类的字节码文件对象
* getClass()
* 类名.class
* Class.forName() *****
7. 获取字节码文件中的构造方法,并运行
* getConstructor(参数)获取构造方法
* getConstructors()获取所有public的构造方法,存储数组
* getDeclaredConstructor(参数)获取所有的构造方法,非public
* Constructor类的 newInstance()运行获取到的构造方法
8. 获取成员方法并运行
* getMethods()获取成员方法,存储数组
* getMethod(方法名,参数列表)
* getDeclaredMethod(方法名,参数列表)
* Method类的 invoke(对象,方法的参数)
9. 获取成员变量并改值
10. 使用反射技术,让用户指定运行哪一个类,和哪一个方法 *****
* 反射技术
* Class Method Constructor
* IO技术
* FileReader
* 配置文件技术 Properties
* load(字符读取流)
11. 使用反射技术,绕过编译器检查,将不同的数据类型,存储到带有固定泛型的集合中
对反射的综合应用:使用反射技术绕过编译器检查
package cn.itcast.reflecttest;
/*
* 使用反射技术,绕过编译器检查,将不同的数据类型,存储到带有固定泛型的集合中
* 不是说,存储到集合中数据不需要使用,考察你是否理解反射的使用
* 泛型的擦除
*/
import java.util.ArrayList;
import java.util.Iterator;
import java.lang.reflect.*;
public class GenericDemo {
public static void main(String[] args) throws Exception{
ArrayList<String> list = new ArrayList<String>();
list.add("dd");
list.add("3ede");
//获取ArrayList字节码文件对象
Class clazz = list.getClass();
System.out.println(clazz);
Method m = clazz.getMethod("add", Object.class);
m.invoke(list, false);
m.invoke(list, 123);
m.invoke(list, 123.1234);
// System.out.println(list);
Iterator it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
ASP.Net+Android+IOS开发------期待与您交流
详细请查看:http://edu.youkuaiyun.com