一.枚举
定义一个枚举类使用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