枚举


 

注意:枚举是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类


 

常用方法:

java中enum 映射 根据key java枚举映射_java中enum 映射 根据key

 

EnumMap类

 是Map接口的子类,与枚举类型键一起使用的专用 Map 实现。枚举映射中所有键都必须来自单个枚举类型,该枚举类型在创建映射时显式或隐式地指定。枚举映射在内部表示为数组。此表示形式非常紧凑且高效。

注意:在创建对象时必须指定操作的枚举类型。

publicEnumMap(Class<K>  keyType)

 

EnumSet类

是Set接口的子类,与枚举类型一起使用的专用 Set 实现。枚举 set 中所有键都必须来自单个枚举类型,该枚举类型在创建 set 时显式或隐式地指定。

 

注意:EnumSet不能直接实例化,要使用本类中提供的静态方法。

 

java中enum 映射 根据key java枚举映射_jar_02

注意:枚举类不仅可以实现接口,还能在枚举类中定义抽象方法。

 

Java反射机制

反射就是把java类中的各种成分映射成相应的java类。简单说,就是通过一个class文件对象来使用该class文件中的构造方法,成员变量,成员方法。

优点:大大增强了程序的扩展性。

 

Class类:

类就是一组相关的属性和行为的集合,它是一个抽象的概念。由于多个class文件也会存在相同的内容,所以,我们就可以把多个class文件用一个类来描述,这个类就是Class类。

 

注意:所有类的对象实际上都是Class类的实例,所以所有的对象都可以转变为java.lang.Class类型表示。

       常用方法:

 

java中enum 映射 根据key java枚举映射_java_03

获取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类

表示的是类中的构造方法,它的常用方法如下:

java中enum 映射 根据key java枚举映射_枚举类型_04

 

Field类

表示类中的属性。常用方法如下:

java中enum 映射 根据key java枚举映射_jar_05

 

Method类

表示类中的成员方法。常用方法如下:

java中enum 映射 根据key java枚举映射_java中enum 映射 根据key_06

java中enum 映射 根据key java枚举映射_java_07

 

通过反射调用类中的方法:

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类表示数组。

 

java中enum 映射 根据key java枚举映射_jar_08


类加载器


 

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。