9.JAVA反射编程概述
一、枚举数据类型
枚举是常量字段的数组形式,数组中的常量不能被改写。
通过enum关键字来修饰一个类为枚举类
/**枚举类的特性:
* 无法使用new构建一个实例,可以定义接口,但无法被继承
*/
public enum EnumClass {
//定义一组常量值,枚举类的方法和属性必须写在枚举常量之后
RED,
GREED,
BLACK,
YELLOW
}
/*枚举类的静态方法*/
EnumClass[] enums = EnumClass.values();//获取所有枚举元素
for (EnumClass e:enums){
System.out.println(e.name());//获取枚举元素的名字
System.out.println(e.ordinal());//获取枚举元素的索引
}
System.out.println(EnumClass.valueOf("BLACK"));//给定枚举元素名称获取该枚举元素
二、反射编程
Class对象
Java将JVM中运行的对象用Class来表示,Class表示一个类所映射的字节码文件
可以通过Class对象来对一个类进行反射编程的操作
Class对象的创建
没有相应的构造方法,只能通过静态方法进行调用
创建某个类的反射对象
/*创建Class字节码对象*/
Class empClass = Class.forName(String getClass);//使用某个类包的绝对路径字符串进行创建
Class的常用方法
public static Class forName(String className)
返回与给定字符串名称的类或接口相关联的类对象
public Object newInstance()
通过反射对象使用无参构造创建给定对象的实例
int getModifiers()
获取某个类的访问权限,返回1为public,2为protected以此类推
Constructor,Field,method对象中均有此方法
Field[] getFields()
获取所有公共的字段并返回数组
Constructor,Class,method对象中均有此方法
Field[] getDeclaredFields()
获取所有访问级别的字段
Constructor,Class,method对象中均有此方法
Constructor对象
对某个对象的构造方法进行访问
Constructor对象的创建
通过Class对象调用此方法获得
Constructor getConstructor(T.class,···parameter Type)
类中定义的构造方法,通过声明参数类型获取当前类的有参构造器返回一个构造器对象,若无参数则返回无参构造
Constructor常用方法
Constructor<?> newInstance(Object···initargs)
通过给定的参数运行新实例的构造方法
Class<?> empClass = Class.forName("com.JavaSE.Refects.Employee");
/*使用getConstructor获取Constructor对象*/
Constructor<?> empConstor = empClass.getConstructor(String.class, String.class);
int getParameterCount()
获取当前构造方法的参数个数
Field对象
对某个对象的属性进行访问
Field对象的创建
Field getField(String FieldName)
通过Class对象调用此方法通过给定的字符串属性名创建Field对象
/*创建employee的字节码对象*/
Class<?> empClass = Class.forName("com.JavaSE.Refects.Employee");
/*反射原理创建对象新实例*/
Employee emp = (Employee) empClass.newInstance();
/*获取公共的字段*/
Field empField = empClass.getField("name");//通过给定的字段名获取
/*临时修改访问级别*/
empField.setAccessible(true);//若为true则在本次运行中将私有字段设置为可见
Field常用方法
void set(Object···String type)
给定的对象以及该Class对象对应的属性字符串形式的名称设置公共字段
/*通过反射原理获取类的方法*/
Method empMethod = empClass.getMethod("work",Integer.class);//通过给定的字符串形式获取方法
/*临时修改访问级别*/
empMethod2.setAccessible(true);//私有方法需要修改访问级别才能被运行
/*传参并运行公共方法*/
empMethod.invoke(emp,8);
Object get(Object)
获取相应对象已设置的字段
void setAccessible(boolean bool)
Java在运行中为私有属性临时改变访问级别,从而使其设置并获取
Method对象
提供有关类和接口上单一方法的信息和访问权限。 反映的方法可以是类方法或实例方法(包括抽象方法)
Method对象的创建
Method getMethod(String MethodName,···parameterType.class)
通过Class对象调用此方法,通过给定的方法名,以及想对应的参数类型创建Method对象,无参数则不写
*通过反射原理获取类的方法*/
Method empMethod = empClass.getMethod("work",Integer.class);//通过给定的字符串形式获取方法
/*传参并运行公共方法*/
empMethod.invoke(emp,8);
/*访问非公共方法*/
Method empMethod2 = empClass.getDeclaredMethod("run");
empMethod2.setAccessible(true);//临时修改访问级别
empMethod2.invoke(emp);//运行emp对象的方法
Method常用方法
Object invoke(Object,Object···args)
运行此对象的公共方法,给定此对象名以及构造器参数创建Method方法,方法无参数则不写
void setAccessible(boolean)
通过修改方法的访问级别来访问私有的方法,布尔值为true表示修改