设计师常用的素材网站,发帖推广,it运维解决方案,一站式营销型网站建设反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现#xff0c;它主要用于以下目的#xff1a;
在运行时分析类的能力#xff1a;通过反射#xff0c;可以在运行时检查类的结构#xff0c;比如它的方法、构造…反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现它主要用于以下目的
在运行时分析类的能力通过反射可以在运行时检查类的结构比如它的方法、构造函数、字段等。在运行时查看对象可以调用对象的私有方法和访问私有字段尽管这通常不推荐因为它破坏了封装性。实现通用的数组操作代码通过反射可以编写能够操作任何类型数组的代码。利用动态代理反射经常与动态代理一起使用以在运行时创建接口的代理实现。
反射的基本用法
反射主要通过以下几个类来实现
Class代表正在运行的Java应用程序中的类和接口。Field提供有关类或接口的字段的信息以及对它的动态访问权限。Method提供关于类或接口的方法的信息以及对它的动态访问权限。Constructor提供关于类的构造方法的信息以及对它的动态访问权限。
获取Class对象
获取Class对象有三种常见方式
使用Class.forName(完全限定名)静态方法可能抛出ClassNotFoundException。使用类名.class语法。使用对象的getClass()方法。 通过class对象获取对象的属性 获取指定属性名的public属性——getField(属性名) 获取全部public属性——getFields() 获取已声明的指定属性名的属性——getDeclaredField(属性名) 获取已声明的所有属性——getDeclaredFields() 获取属性的类型、名字、修饰符 获取属性值——get(对象名)
对于public和protected属性可以直接get和set 对于private属性必须要设置可访问才可get和set 修改属性值——set(对象名属性值 记得private属性必须要setAccessible(true)
通过class对象获取对象的构造器 上图只有2个构造方法一个是有一个参数的一个是有2个参数的 获取特定参数类型、个数的构造器——getConstructor(参数类型的class对象)
获取所有构造器——getConstructors() 获取构造器的参数——getParameters() 通过class对象获取对象的方法
根据方法名获取已声明的方法——getDeclaredMethod(方法名参数类型的class对象) 根据方法名获取public方法——getMethod(方法名参数类型的class对象) 获取所有public方法——getMethods()
这里不仅包括对象aClass的所有public方法还包括该对象隐式继承的object类中的public方法 获取所有已声明方法——getDeclaredMethods() 获取方法返回类型——getReturnType() 获取方法上注解为xxx的方法——getAnnotation(注解的class对象)
获取方法的名字——getName() 修改方法中的参数并重新执行——invoke(对象修改后的参数)
原来给output方法传的参数是“”通过invoke函数修改参数并重新执行该对象的output函数后参数改变了。 执行对象中的private方法——invoke(对象
给类添加一个private方法 通过反射执行 小结——对于对象 只想获取public属性就使用getField(属性名)或getFields()想获取任意属性不局限于public、protected、private就使用getDeclaredField(属性名)或getDeclaredFields()想获取属性的类型用getType()想获取属性的名字用getName()想获取属性的修饰符用getModifiers()想获取属性的值用get(对象)想设置属性的值用set(对象值)private属性得先将属性设置为可达setAccessible()才能get()和set()想获取指定参数个数类型的构造器就使用getConstructor()想获取所有构造器就使用getConstructors()获取构造器的参数就使用getParameters()只想获取public方法就使用getMethod(方法名)或getMethods()(后者会获取到继承类上的public方法想获取任意方法不局限于public、protected、private就使用getDeclaredMethod(方法名)或getDeclaredMethods()想获取方法上的注解就使用getAnnotation(注解的class类)想获取方法的返回值就使用getReturnType()想获取方法名就使用getName()想执行方法就用invoke(对象)想修改方法所传参数的值并重新执行该方法就使用invoke(对象修改后的值)