黑马程序员--枚举与反射的回顾

本文详细介绍了枚举的定义及使用方法,包括枚举类的定义格式、枚举中的常用方法及其应用场景。同时深入探讨了Java反射机制,涵盖如何通过反射获取类的构造方法、成员变量、方法等内容。

一.枚举 
   定义一个枚举类使用enum,它是一个抽象类,定义的列表元素都是它的实例对象。定义枚举类格式如下:
   权限修饰符 enum 枚举类名{
      元素1,元素2,元素3,...
      类中的其他成分
   }
   当枚举类单独存在时,权限有public和缺省两种,当枚举类用作内部类时,有public,protected,
缺省,private四种权限修饰符。定义枚举类时需注意四点:
1.枚举中的元素列表必须放在枚举类其他成分之前,也就是说元素列表要放在第一位;
2.枚举中的构造方法权限为private,当枚举类中有多个构造方法时,可以在列表中元素上指定哪一个;
3.枚举中除了元素列表还有其他成分时,需在元素列表之后加“;”,没有其他成分时,不用加;
4.对于枚举类中的抽象方法,通常会在元素列表中使用内部类进行重写。
   枚举中常用方法:name()(获取元素名称),ordial()(获取在元素列表中的编号),getClass()(获取定义的枚举类)这三个是实例对象的方法
枚举类中最常见两个静态方法:valueOf(str)(将传进来的字符串转成枚举实例对象),
values()(获取枚举类中元素列表,返回的是数组,类型为枚举类,可以使用数组的操作方法对其进行遍历)。举例如下:
public class Enumtest{
       public static void main(String[] args) {
             TrafficLamp tl=TrafficLamp.RED;
             System.out.println(tl.nextLamp());;
             System.out.println(tl.name());
             System.out.println(tl.ordinal());
             System.out.println(tl.getClass());
             System.out.println(TrafficLamp.valueOf("GREEN"));
             TrafficLamp[] TrafficLamps=TrafficLamp.values();
             System.out.println(TrafficLamps.length);
             for(int x=0;x<TrafficLamps.length;x++){
              System.out.println(TrafficLamps[x]);   
  } 
       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 long time;
          private TrafficLamp(long time) {
                    this.time = time;
          }
      }
}
二.反射
    反射:将java类中的各种成分映射成相应的java类。
   1. Constructor
      获得一个给定对象对应的字节码文件中的所有构造方法可以这样做:
      Constructor[] constructors=obj.getClass().getConstructors();
    例:new String(new StringBuffer("abc"));运用反射可以如下操作:
       Constructr constructor=String.class.getConstructor(StringBuffer.class);
       String str=(String)constructor.newInstance(new StringBuffer("abc"));
    当创建无参的实例对象时,可以用Class中的newInstance方法,操作如下:
    String str=(String)String.class.newInstance();其实该方法内部调用了空参数的构造方法去
 创建一个String实例对象。
   2.Field
   Class中提供了一些获取类中成员变量的方法。对于类中公有的成员变量,可以通过getField方法获得,
对于非公有的成员变量可以通过getDeclaredField方法获取并通过设置setAccessible(true)进行访问。如果我们想获得一个Class实例对象中的所有
成员可以使用getFields方法,通过Field的实例对象field的getType可以知道该成员变量的类型。
   3.Method
   像Field一样,Class中提供了对其实例对象中的方法进行获取的函数,通过getMethod方法,
获得字节码文件中的公有方法,通过getMethods获取该文件中所有公有的方法包括继承或实现接口得来的方法,对于声明的所有方法可以使用相应的
getDeclaredMethod和getDeclaredMethods但不包括继承的方法。获得方法后使用如下格式操作:
方法名.invoke(调用对象object,Object... args);
   4.数组反射
     (1)只有具有相同的参数类型和相同的维数,两数组才对应同一份字节码文件。
     (2)基本类型数组只能看作是Object对象,而非基本数据类型数组既可以看成是Object对象,也可以看成是Object[]。
     (3)将基本数据数组转变成集合后,该数组整体成为集合中一元素,将非基本数据类型的数组变成集合,数组的元素相应变成集合中的元素。
    用反射操作数组的好处:可以对数组的数据进行修改,可以获取数组的长度等
    常用方法:Array.getLength(obj),Array.get(Object array, int index),Array.set(Object array, int index, Object value)等
   反射在框架结构中应用较多
   工具类和框架的区别:工具类是被用户写的类调用,而框架则是调用用户写的类,通过配置文件方式。

转载于:https://www.cnblogs.com/liu-yuan-ming/archive/2012/04/21/2461739.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值