浅述java反射(大白话,简单明了)

1.什么是java反射机制

java反射机制是指在程序的运行过程中可以构造任意一个类的对象、获取任意一个类的成员变量和成员方法、获取任意一个对象所属的类信息、调用任意一个对象的属性和方法
口语化:
类的实例化:一般java程序实例化类的对象通过new 类名()来实例化一个类的对象。但是反射就先实例化类的Class类对象(三种方法,标题3详述),再通过Class类对象直接调用类的无参构造方法,或者是通过Class类对象进一步获取与类构造函数相关类(Construct类)的对象,进一步通过有参的构造函数实例化。
方法的调用:一般java程序中调用类的方法是通过实例化类的对象,然后用 对象.方法(实际参数) 来达到方法的调用,所谓反射就是利用另一种方式去调用类的方法,通过实例化类的方法相关类(Methord类)的对象,通过方法对象.invoke(类对象,实际参数)来实现方法的调用。
方法成员变量的获取:
一般java程序中获取类的成员变量是通过实例化类的对象,然后用 对象.get() 来达到成员变量的获取,所谓反射就是,通过实例化类的成员变量相关类(Filed类)的对象,通过Filed类的众多的get方法来实现成员变量的获取。

2.为什么用反射机制

反射机制使得java程序具有动态获取程序信息和动态调用对象方法的能力。

有些时候,我们在编译器并不知道接口会调用哪个方法,需要根据运行时传入的参数决定,这个时候就能用到反射

3.如何使用反射

可以通过调用以下的类进行反射调用

Class类:可获得和类信息相关的类的信息
获取一个类字节码对象的三种方法:
1.对象.getClass()——Class getClass() 这个方法是Object对象就有的
2.类型的名称.class
Class clazz = String.class;
Class clazz = int.class;
3.Class.forName(“类的全类名”)——Class的静态方法获取一个类的字节码对象
Class clazz = Class.forName(“java.lang.String”);

Construct类:可获得类的构造方法等信息(获取该类对象的方法来自于Class类)
通过Class类的以下方法获取Construct对象
1.Constructor[] getConstructors():获取一个类中所有被public修饰的构造方法对象
2.Constructor getConstructor(Class…parameterTypes):获取一个类中指定的被public修饰的构造方法对象
3.Constructor[] getDeclaredConstructors():获取一个类中所有的构造方法对象
4.Constructor getDeclaredConstructor(Class… parameterTypes):获取一个类中指定的构造方法对象
同时,Class类中有一个类无参构造方法能快捷生成对象的方法
T newInstance():根据无参构造快速的创建一个该类的对象

有参构造方法来自于 Constructor 类的方法 来实现对象创建
T newInstance(Object…initargs)

Field类:可获得类的成员变量(获取该类对象的方法来自于Class类)
通过Class类的以下方法获取Field对象
1.Field[] getDeclaredFields():获取一个类中所有的成员变量对象
2.Field getDeclaredField(String name):获取一个类中指定的成员变量对象
用Field对象对类的成员变量进行赋值和取值操作:
Object get(Object obj):取值 Object obj:取值的对象
void set(Object obj, Object value):赋值
Object obj:赋值的对象
Object value:你要把这个参数的值设置为多少

Methord类:可获取类的方法信息(获取该类对象的方法来自于Class类)
通过Class类的以下方法获取Methord对象
1.Method[] getDeclaredMethods():获取一个类中所有的成员方法对象
2.Method getDeclaredMethod(String name, Class… parameterTypes):获取一个类中指定的成员方法对象
String name:方法名 -> 写方法名字的时候不要加()
Class…parameterTypes:方法形式参数数据类型的字节码对象
通过Methord类的对象进行方法调用:
Object invoke(Object obj, Object… args):方法调用
Object obj:具体调用方法的对象
Object… args:启动方法需要你传入的实际参数

Construct类、Filed类、Methord类都位于java.lang.reflect 类库,Class 和 java.lang.reflect类库 一起对反射提供了支持

最后,反射能通过暴力操作来获取和修改类的私有成员变量,以及调用类的私有成员方法。将类的私有成员变量打开权限:成员.setAccessible(true);

关于反射的优缺分析:
优,
应用程序可以利用全限定名创建可扩展对象的实例,来使用来自外部的用户自定义类。也就是通过Class.forName(“类的全类名”)可创建一个外部的用户自定义类的实例。
缺,
反射涉及了动态类型的解析,所以 JVM 无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。在使用反射能完成代码功能的情况下就不使用反射。
由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用,这可能导致代码功能失调并破坏可移植性。

你可能感兴趣的:(java,开发语言)