9.JAVA反射编程概述

Java反射编程

当Java对象不使用new操作符创建实例时,可以通过解析类的字节码文件来创建实例以及使用属性和方法的操作

一、枚举数据类型

枚举是常量字段的数组形式,数组中的常量不能被改写。

通过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表示修改

posted @ 2022-05-08 22:12  海涛布克  阅读(58)  评论(0编辑  收藏  举报