一、枚举
枚举本质上是个类,一个所能创建的对象已经确定了的特殊的类。
举个例子
class Grade{
private Grade(String str){
this.value = str;
}
public String value;
public String getValue(){
return this.value;
}
public static final Grade A = new Grade("90-100");
public static final Grade B = new Grade("80-89");
}
enum Grade{
A("90-100"),B("80-89");
public String value;
private Grade(String str){
this.value = str;
}
public String getValue() {
return this.value;
}
}
这两段代码实现的功能是一样的,都是定义了一个枚举类,有A,B两个枚举对象,每个枚举对象有一个value值。
带抽象方法的枚举:
枚举类中有抽象方法,可以在定义枚举对象的地方重写抽象方法
enum Grade3{
A(){
@Override
public String getValue() {
return "90-100";
}
}
,B(){
@Override
public String getValue() {
return "80-89";
}
};
public String value;
abstract public String getValue();
}
二、反射
反射用于构建框架
给定类完整名称,获得类的字节码(也叫加载类),然后获取类中各个字段和方法,并加以调用
反射的第一步,加载类
加载类有三种方式
以Person类为例
1.Class clazz = Class.forname(javaweb.study.reflect.Person);//包含包名的完整类名
2.Class clazz = new Person().getClass();
3.Class clazz = Person.class;
然后就是调用类的方法
1.构造函数
Constructor c = clazz.getConstructor(args);//args为构造函数的参数类型,String.class,int.class等
获取到构造函数后,创建对象,用newInstance方法
2.普通方法
Method m = clazz.getMethod(name,args);//name为方法名,args为参数类型
m.invoke(object,args);//如果调用的为静态方法,object可以填null
若要调用的方法访问限定符为private,则需用getDeclaredMethod,获取到方法后,用setAccessible(ture)暴力反射
特别的,反射调用参数是数组的方法,参数要用一个数组包裹起来,为了兼容jdk1.4,Java编译器做出的妥协所致
3.字段
Field f = clazz.getField("name");
Object obj = f.get(p);//p为对象