本文就来磋商一下Java反射的观点和基本事理,以及我们可以利用反射机制来做什么。
什么是反射Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或工具的属性和方法。
Java属于先编译再运行的措辞,程序中工具的类型在编译期就确定下来了。当程序在运行时可能须要动态加载某些类,这些类由于之前用不到,以是没有被加载到JVM。通过反射,可以在运行时动态地创建工具并调用其属性,不须要提前在编译期知道运行的工具是谁。

Java的反射事理和Class工具有关系。反射机制实质是JVM得到Class工具之后,再通过Class工具进行反编译,从而获取工具的各种信息。
Class工具的由来是JVM对类加载过程中,将.class文件读入内存,并为之创建一个Class工具。创建Class工具的过程如下:
当实行new语句创建一个工具时,会触发JVM加载这个类的.class文件;JVM从本地磁盘找到.class文件并加载到JVM内存中。.class文件载入内存往后,JVM会自动创建一个Class工具,一个类只会产生一个Class工具。JVM创建Class工具过程
Class本身是一个类,位于java.lang包下。一样平常可以通过三种办法得到Class工具。得到Class工具后,就可以反向获取工具的各种信息。
(1)getClass()方法;
Class clazz = u.getClass();
(2)任何数据类型(包括基本的数据类型)都有一个“静态”的class属性;
Class clazz = User.class;
(3)通过Class类的 forName() 方法;
Class clazz = Class.forName( "com.xxx.User" );
反射能获取什么信息判断工具的类型:我们一样平常利用 instanceof 关键字来判断某个工具是否为某个类的实例,同时也可以借助反命中Class工具的 isInstance() 方法来判断某个工具是否为某个类的实例。
创建实例:利用Class工具的 newInstance() 方法来创建Class工具对应类的实例。
获取布局方法:先可以通过Class工具获取指定的布局方法(Constructor)工具,再调用Constructor工具的 newInstance() 方法来创建工具。
getConstructor( ):获取某个公有布局方法;
getDeclaredConstructor( ):获取某个布局方法, 可以是私有,或受保护、默认、公有;
getConstructors( ):获取所有公有布局方法;
getDeclaredConstructors( ):获取所有的布局方法,包括私有、受保护、默认、公有。
获取成员变量:通过Class工具的forName()方法可以得到类成员的字段信息,可以进一步对成员变量进行操作。
Class clazz= Class.forName ( "com.xxx.User" );
Field f = clazz.getField ( "name" );
f.set ( u, "微说互联网" ); // 个中u是User实例,通过Field.set()可以对u的成员变量赋值。
获取成员方法:通过Class工具的 getMethod() 或 getDeclaredMethods() 方法,可以得到某个指定的成员方法,并可以进一步调用该方法。getMethods() 可以得到全部公有方法,getDeclaredMethods() 还可得到包括私有方法在内的全部方法。
Method m = clazz.getMethod ( "setName", User.class );
m.invoke ( u, "微说互联网" ); // 个中u是User实例,"xxx"是User.setName()须要的参数。
前文《Spring AOP动态代理的实现办法 》先容过,在AOP动态代理的实现中,便是通过反射机制来获取被代理类的成员方法,然后再通过代理类调用。
总结反射机制最大的优点是:能够让我们很方便地创建灵巧的代码,这些代码可以在运行时装置,无需在组件之间进行源代码的链接,更加随意马虎实现面向工具。
可以说,如果没有反射机制,就不会有现在开拓中常用的各种框架。不过反射调用方法可以忽略权限检讨,可能会毁坏封装性导致安全问题。
我会持续更新关于物联网、云原生以及数字科技方面的文章,用大略的措辞描述繁芜的技能,也会偶尔揭橥一下对IT家当的意见,欢迎大家关注,感激。