Java高新技术-枚举和反射-----黑马程序员

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.csdn.net


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值