- 什么是反射
- 在运行状态中,对于任意一个类,都能够知道这个类所有属性和方法
- 在运行状态中,对于任意一个对象,都能够调用它的任意一个方法和属性
这种动态获取信息以及动态调用对象方法的功能即java反射机制 - 具体点:反射就是把java类中各个成分映射成一个个Java对象,在类装载时完成
- 一个类中这些成员方法、构造方法、在加入类中都有一个类来描述,通过反射实例的方法获取这些类的实例,调用它们的方法,从而使用了反射的功能
- 举例
1) Constructors c = fansheStu.getConstructors();/通过反射实例的方法获取构造函数实例
2) Stu stu = c.newInstance();//调用构造函数实例的方法创建Stu对象
- 反射的作用
- 增加程序灵活性,避免重新编码:框架中使用最多,举例如下
- struts2框架通过struts2.xml文件查找对应类信息及方法名,然后创建相应的实例访问相应的方法
- 反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。这是一个相对高级 的特性
- 缺点
- 性能第一 Performance Overhead
反射包括了一些动态类型,所以 JVM 无法对这些代码进行优化。因此,反射操作的效
率要比那些非反射操作低得多 - 内部暴露 Exposure of Internals
由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方
法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性
- 性能第一 Performance Overhead
- 增加程序灵活性,避免重新编码:框架中使用最多,举例如下
- 反射的使用(Class类的使用)
- 什么是Class
- Class 类的实例表示正在运行的 Java 应用程序中的类和接口。也就是jvm中有N多的实例每个类都有该Class对象。(包括基本数据类型)
- Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的defineClass 方法自动构造的。也就是这不需要我们自己去处理创建,JVM已经帮我们创建好了,我们需要用到哪个Class对象,直接获取即可.
- 没有公共的构造方法,如何创建某个类的反射实例呢?
- 实例的getClass()方法
1) 源自父类的Object的方法
2) - 类自带的静态class属性
- 使用Class类的静态方法:forName(String className)
- 实例的getClass()方法
- 常用的方法
- 获取构造方法实例
1) public Constructor[] getConstructors() 返回所有"公有的"构造方法实例组成的数组
public Constructor[] getDeclaredConstructors() 返回所有构造方法实例组成的数组(包括私有、受保护、默认、公有)
public Constructor getConstructor(Class... parameterTypes) 获取单个的"公有的"构造方法
public Constructor getDeclaredConstructor(Class... parameterTypes) 获取"某个构造方法"可以是私有的,或受保护、默认、公有
2) 获取Constructor实例后常用的方法是:newInstance()创建实例(私有的构造函数实例调用此方法会抛出异常) - 获取成员变量实例
1) Field[] getFields() :获取所有的"公有字段"
Field[] getDeclaredFields(): 获取所有字段,包括:私有、受保护、默认、公有
public Field getField(String fieldName) :获取某个"公有的"字段
public Field getDeclaredField(String fieldName): 获取某个字段(可以是私有的)
2) 获取成员变量实例后常用方法是:public void set(Object obj,Object value),为某个对象的这个字段设置值(如果是私有的成员实例,调用此方法会抛异常java.lang.IllegalAccessException) - 获取成员方法实例
1) public Method[] getMethods() :获取所有"公有方法";(包含了父类的方法也包含Object类)
public Method[] getDeclaredMethods() :获取所有的成员方法,包括私有的(不包括继承的)
public Method getMethod(String name,Class<?>... parameterTypes) :name : 方法名;Class ... : 形参的Class类型对象,可是多个
public Method getDeclaredMethod(String name,Class<?>... parameterTypes 获取"某个方法"可以是私有的,或受保护、默认、公有
2) 获取成员方法实例后常用的方法是:public Object invoke(Object obj,Object... args),为某个对象调用方法(obj : 要调用方法的对象;args:调用方式时所传递的实参),私有方法不能调用 获取静态main方法实例
2) 方法实例调用时,obj传入null,因为它是静态的方法
1) stuClass.getMethod("main", String[].class);
3)
- 获取构造方法实例
- 反射与配置文件结合使用
- 通过反射越过泛型检查
- 什么是Class
- 说明
- 在运行期间,一个类,只有一个Class对象产生
- 获取Class三种方式常用第三种方式
- 第一种:对象都有了还要反射干什么呢?
- 第二种:需要导入类的包,依赖太强,不导包就抛编译错误
- 一般都第三种:一个字符串可以传入也可写在配置文件中后读取,这样程序相当灵活,可以做到不修改代码,只改配置文件(框架就这这样做的)
转载于:https://www.cnblogs.com/River111/p/9716603.html