枚举
注意:枚举是JDK5之后的一个重要特性,在枚举中可以限制一个类的对象产生的范围,加入枚举之后,java又对之前的类集进行了扩充,产生了一些新的枚举支持类——EnumSet、EnumMap。
定义枚举类型
格式:[public] enum 枚举类型名称{
枚举对象1,枚举对象2,……枚举对象n;
}
public classEnumDemo {
public static void main(String []args){
//取出周末
Weekw = Week. SUNDAY;
System.out.println(w);
for(Week week:Week.values()){
//用枚举.values()得到全部枚举的内容
System.out.println(week);
}
}
}
enum Week{
SUNDAY,MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY;
}
Enum类
常用方法:
EnumMap类
是Map接口的子类,与枚举类型键一起使用的专用 Map
实现。枚举映射中所有键都必须来自单个枚举类型,该枚举类型在创建映射时显式或隐式地指定。枚举映射在内部表示为数组。此表示形式非常紧凑且高效。
注意:在创建对象时必须指定操作的枚举类型。
publicEnumMap(Class<K> keyType)
EnumSet类
是Set接口的子类,与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。
注意:EnumSet不能直接实例化,要使用本类中提供的静态方法。
注意:枚举类不仅可以实现接口,还能在枚举类中定义抽象方法。
Java反射机制
反射就是把java类中的各种成分映射成相应的java类。简单说,就是通过一个class文件对象来使用该class文件中的构造方法,成员变量,成员方法。
优点:大大增强了程序的扩展性。
Class类:
类就是一组相关的属性和行为的集合,它是一个抽象的概念。由于多个class文件也会存在相同的内容,所以,我们就可以把多个class文件用一个类来描述,这个类就是Class类。
注意:所有类的对象实际上都是Class类的实例,所以所有的对象都可以转变为java.lang.Class类型表示。
常用方法:
获取Class类文件的对象通常有三种方法:
(1)、Object类中的getClass()方法。
例如:
Person p = new Person();
Class c = p.getClass();
(2)、通过数据类型的一个静态的class属性。
例如:
Class c3= Person.class;
(3)、通过Class类的一个静态方法forName()。
例如:
Class c4 = Class.forName(“cn.Person”);
注意:程序中所有使用的具体类名在设计时(即开发时)无法确定,只有程序运行时才能确定,这时候就需要使用Class.forName去动态加载该类,这个类名通常是在配置文件中配置的。
使用反射的基本步骤:
(1) 获得字节码文件对象,就是获得Class对象。
(2) 获得类的成员属性、方法或者构造函数。
(3) 访问属性,调用构造函数创建对象,调用成员方法。
Constructor类
表示的是类中的构造方法,它的常用方法如下:
Field类
表示类中的属性。常用方法如下:
Method类
表示类中的成员方法。常用方法如下:
通过反射调用类中的方法:
public classPerson {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String sayHello(String name,int age){
return "你好!我叫"+name+",今年"+age+"了。";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
import java.lang.reflect.Method;
public classPersonDemo {
public static void main(String[] args) throws Exception {
//实例化Class对象
Classcl = Person.class;
//通过Class对象获得sayHello()方法对像
Methodmt = cl.getMethod("sayHello",String.class,int.class);
//调用sayHello方法并输出结果
System.out.println(mt.invoke(cl.newInstance(),"西门庆",38));
}
}
暴力反射
反射操作数组
注意:在java.lang.reflect中,使用Array类表示数组。
类加载器
Bootstrap ClassLoader:采用C++编写,开发中看不到
Extension ClassLoader:进行扩展类的加载,对应的是jre\lib\ext目录
AppClassLoader:加载classpath指定的类,最常用的一种类加载器。
注意:jvm里有多个类加载,每个类加载可以负责加载特定位置的类,例如,bootstrap类加载负责加载jre/lib/rt.jar中的类,我们平时用的jdk中的类都位于rt.jar中。extclassloader负责加载jar/lib/ext/*.jar中的类,appclassloader负责classpath指定的目录或jar中的类。除了bootstrap之外,其他的类加载器本身也都是java类,它们的父类是ClassLoader。