黑马程序员_枚举与反射

来源:互联网 发布:检查域名是否被墙 编辑:程序博客网 时间:2024/05/17 04:33

-----------android培训java培训、期待与您交流! ------------

 

枚举

1、可以把枚举看做是一个特殊的java类,用enum关键字来定义,它已经继承了Enum类,不能再继承其他类。

2、枚举的构造函数必须是私有的。保证枚举常量是固定的,不能创建新的enum实例。当枚举只有一个成员时,可作为单例的实现方式。

3、枚举中的枚举常量必须在枚举类的最前面。

4、枚举中可以实现接口,枚举默认实现了Comparable接口。

5、枚举中可以有属性和方法。enum允许程序员为每个enum实例赋予各自不同的行为。

6、枚举中的每个枚举变量(也叫枚举常量)都是enum的实例,隐式修饰符为pubic  staticfinal,只需实例化一次,其他的方法和变量就都能被调用。枚举中其他非枚举变量或方法可用任意修饰符。

注意:enum不能用abstract修饰,但是可以在enum中定义抽象方法,枚举常量必须对抽象方法进行重写,此时枚举常量即为enum子类的实例。

7、枚举可以用在swtich语句中。使用枚举类型时注意枚举的空值。建议在switch语句中保留default语句进行异常控制。

8、枚举类里面还定义了一些隐含的publicstatic final field 的成员变量,对应着枚举常量的名字,也就是说每个枚举常量都有个字符串类型的名字,其名称和定义的枚举常量的字面值一样,可用覆盖toString方法自定义枚举常量的名称。与之对应的是valueOf方法,调用valueOf("字符串类型名称")将返回相应的枚举常量。enum还提供了values方法,通过该方法能遍历所有枚举值。

注意:values() 方法是编译器插入到enum 定义中的static 方法,将enum类向上转型为Enum类后,values方法不可使用。可以通过Class中getEnumConstants方法取得所有enum实例。

9、每个枚举常量都有个序数,表明它在枚举声明中的位置,初始常量序数为零。可用ordinal()方法返回枚举常量的序数。比较枚举类型常量的值是否相等,可直接使用"==";比较两个枚举类型常量的值的大小,可以使用compareTo()方法,实际比较的是两个枚举常量序数的大小。

10、创建枚举常量主要有三种方法:直接利用枚举类型创建枚举常量、使用Enum的valueOf()静态方法创建枚举常量、使用枚举类型的valueOf()静态方法创建枚举常量。

注意:在使用valueOf()方法时,必须进行检验,避免输入不正确的枚举常量名称抛出非法参数异常。

 

11、自定义枚举时限制枚举常量在64个以内。JDK在遇到枚举类型小于等于64个的时候会创建java.util.RegularEnumSet,而遇到大于64时则会创建java.util.JumboEnumSet,这是因为底层JDK使用了Long类型进行了映射,我们都知道Long类型是64位的,而枚举类型又可以化为整数来存储,刚好64个枚举类型对应到Long类型的64位进行存储,而当大于64时,则需要使用java.util.JumboEnumSet来创建,使用了Long数组进行存储

 

反射

反射就是把Java类中的各种成分映射成相应的Java类,即将类文件和组成类的各部分(如构造函数、属性字段、方法等)用Java语言描述并封装成对象,通过分析用户指定加载的字节码文件,获取构造函数、属性字段、方法等,实现程序功能。

反射的作用:实现框架功能,创建通用型框架,根据使用时指定的字节码文件实现框架功能。

反射相关类

Class类

Class类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。

1、  获得Class类对象的方法

类名.class;

对象.getClass;

Class.forName(完整类名);常用于反射。

2、部分方法

static Class<?> forName(StringclassName):返回与带有给定字符串名的类或接口相关联的 Class对象。

ClassLoader getClassLoader():返回该类的类加载器。

Constructor<T>getConstructor(Class<?>... parameterTypes) :返回一个 Constructor 对象,它反映此 Class对象所表示的类的指定公共构造方法。

Constructor<?>[] getConstructors():返回一个包含某些Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。

T[] getEnumConstants():如果此 Class 对象不表示枚举类型,则返回枚举类的元素或 null。

Field getField(String name):返回一个 Field 对象,它反映此 Class对象所表示的类或接口的指定公共成员字段。

Field[] getFields():返回一个包含某些Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

Class<?>[] getInterfaces():确定此对象所表示的类或接口实现的接口。

Method getMethod(String name,Class<?>... parameterTypes):返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。

Method[] getMethods():返回一个包含某些Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。

String getName():以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

Package getPackage():获取此类的包。

Class<? super T> getSuperclass():返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。

T newInstance():创建此 Class 对象所表示的类的一个新实例。

 

Constructor类

Constructor 提供关于类的单个构造方法的信息以及对它的访问权限。

Class<T> getDeclaringClass():返回 Class 对象,该对象表示声明由此Constructor 对象表示的构造方法的类。

String getName():以字符串形式返回此构造方法的名称。

Class<?>[] getParameterTypes():按照声明顺序返回一组Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。

boolean isVarArgs():如果声明此构造方法可以带可变数量的参数,则返回 true;否则返回 false。

T newInstance(Object... initargs):使用此Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,并用指定的初始化参数初始化该实例。

String toString():返回描述此Constructor 的字符串。

 

Field类

Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。

Object get(Object obj):返回指定对象上此Field 表示的字段的值。

String getName():返回此 Field 对象表示的字段的名称。

Class<?> getType():返回一个 Class 对象,它标识了此Field 对象所表示字段的声明类型。

void set(Object obj, Object value):将指定对象变量上此Field 对象表示的字段设置为指定的新值。

String toString(): 返回一个描述此 Field 的字符串。

注意:若属性字段被私有化,则使用getDeclaredField方法,同时修改访问权限值field.setAccessible(true)才能访问。

 

Method类

Method 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。

Class<?> getDeclaringClass():返回表示声明由此Method 对象表示的方法的类或接口的 Class 对象。

String getName():以 String 形式返回此 Method 对象表示的方法名称。

Class<?>[] getParameterTypes():按照声明顺序返回Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型。

Class<?> getReturnType():返回一个 Class 对象,该对象描述了此Method 对象所表示的方法的正式返回类型。

Object invoke(Object obj, Object... args):对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。若调用的是静态方法,第一个参数值为null。

String toString():返回描述此 Method的字符串。

 

0 0