反射
- 概念
- 定义:程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义
- 理解:在程序运行期,动态加载类文件,并能探知类的基本结构,能够创建类的对象,访问属性和方法等
- 反射的优缺点
- 优点:
- 运行期类型的判断
- 动态类加载,所以使用反射能,工厂模式 动态代理 sping等框架
- 反射提高了程序的灵活性和拓展性,降低耦合性,提高自适应能力
- 缺点:
- 性能问题,反射相当于一系列解释操作,通知jvm要做的事情,性能比直接的java代码要慢很多
- 会模糊程序内部逻辑,且不容易维护
- 利用反射可以访问任何的对象,和JAVA的安全机制有冲突,如:一些private修饰的属性和方法,本意是只在对象内部调用和访问的,但是通过反射在外部也可以访问,这严重破坏了安全机制。
- 优点:
- 反射的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时调用任意一个对象的方法
- 生成动态代理
- 反射使用
- 反射:获得Class类
- 反射:获得构造器
- 反射:获得类的实例
- 反射:获得成员方法
- 反射:获得成员属性
获得Class类
三种选择
- 如果已经有一个类的实例,即存在已知对象
- 对象。getclass()方法
- 如果你在编译期知道类的名字:类的属性加载
- 类名。class
- 如果类名在编译期不知道, 但是在运行期可以获得, 你可以使用下面的方法:Class类的forName方
- Class。forName(String),传入类的全限定路径
- 请注意,forName方法会将类文件加载进JVM,所以此类的静态属性会加载,静态代码快会执行
获得构造器
Constructor getConstructor(Class[] params) – 获得使用特殊的参数类型的公共构造函数,
Constructor[] getConstructors() – 获得类的所有公共构造函数
Constructor getDeclaredConstructor(Class[] params) – 获得使用特定参数类型的构造函数(与接入级别无关)
Constructor[] getDeclaredConstructors() – 获得类的所有构造函数(与接入级别无关)
获得类的实例化对象
- Class类的newInstance方法
- 此类必须有空构造才能创建实例,否在抛异常
- 空构造器的权限修饰附必须是public,否则抛异常
- Constructor类的newInstance方法
- 此方法可以传参数,所以可以利用空构造器,也可以用带参构造创建对象
- 相应构造方法存在,且权限修饰附为public
获得类中的方法
Field getField(String name) – 获得命名的公共字段
Field[] getFields() – 获得类的所有公共字段
Field getDeclaredField(String name) – 获得类声明的命名的字段
Field[] getDeclaredFields() – 获得类声明的所有字段
获得类中的属性
Method getMethod(String name, Class[] params) – 使用特定的参数类型,获得命名的公共方法
Method[] getMethods() – 获得类的所有公共方法
Method getDeclaredMethod(String name, Class[] params) – 使用特写的参数类型,获得类声明的命名的方法
Method[] getDeclaredMethods() – 获得类声明的所有方法
Class类
- 概述
- Class‘<’T‘>’: T - 由此 Class 对象建模的类的类型,如果将被建模的类未知,则使用 Class“<“?”>”
- 表示类的类,描述类的内部结构的
- 方法:
带declared是获取所有的
不带是获取公共访问的
- 获取构造器Constructor
- 获取属性Field
- 获取方法Method
- asSubclass(Class) :强制转换以表示指定类对象的子类的class
- cast(Object obj) :转换为Object的类型的class
- 获得注解
- getAnnotation(Class annotationClass) :获取指定注解
- getAnnotations() :获得所有的注解
- getDeclaredAnnotations() :获取直接写在此类上注解,继承的注解不要
内部类有关
- getClasses() :获取此类的公共访问的内部类
- getDeclaredClasses() :返回所有内部类
- getDeclaringClass() ::如果此类是某个类的内部类,则返回此类的外部类
获取父接口
- getInterfaces():获取所有的接口
- getGenericInterfaces() :直接父接口
- getGenericSuperclass() :所有的超类,包括类和接口
- 获取父类
- getSuperclass()
- 获取类的修饰符
- getModifiers() :int类型表示的修饰符
- getName() :获取名称,全限定路径
- getPackage() :获取包
- getClassLoader() :获取类加载器
- getResource(String name) :获取指定名称所指定的资源,URL
- getResourceAsStream(String name) :获取指定名称文件的输入流,InputStream
- newInstance() :创建类的实例化对象
- isXXX:确认是否某类型的类,重载方法
Constructor类
- 概述
- 提供关于类的单个构造方法的信息以及对它的访问权限
- 方法
- 获取注解
- getAnnotation(annotationClass) :指定类型注解
- getDeclaredAnnotations() :直接注解
- 获取类Class
- getDeclaringClass() :获取此构造器的类
- 获取修饰符
- getModifiers() :int类型表示的修饰符
- 创建对象
- newInstance(Object… initargs) :带参构造的实例化对象
- 获取构造器参数类型
- getGenericParameterTypes() :参数类型
- getParameterTypes() :参数类型
- getParameterAnnotations() :参数的注解
Method
- 概述
- 提供关于类或接口上单独某个方法(以及如何访问该方法)的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)
- 方法
- 获取注解
- getAnnotation(Class annotationClass) :指定注解
- getDeclaredAnnotations() :直接注解
- 获取Class类
- getDeclaringClass() :此方法Method的Class类
- 获取此方法注解的默认值
- getDefaultValue() :方法注解的默认值
- 获取异常类型
- getExceptionTypes() :方法的异常
- 获取参数类型
- getParameterTypes() :参数列表类型
- getParameterAnnotations() :参数列表的注解,返回二维数组 Annotation[][]
- 获取返回值类型
- getReturnType() :返回值类型
- 获取修饰符
- getModifiers() :int类型表示的修饰符
方法调用
invoke(Object obj, Object… args) :调用obj对象的此method表示的带参的方法
- -