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表示修改
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!