什么是反射?
概念: 反射是Java的一种机制,让我们可以在运行时获取类的信息
作用: 通过反射,我们可以在程序运行时动态创建对象,还能获取到类的所有信息,比如它的属性、构造器、方法、注解等;
举一个栗子:
/*通过反射得到对象的构造器*/
public Constructor getConstructor(String className) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
Class<?> aClass = Class.forName(className);
Constructor<?> constructor = aClass.getConstructor();
return constructor;
}
反射作为框架的灵魂,最大的好处就是解耦合,通过以上的例子可以知道后期不管需要什么对象,只要传给我对应的全限定名我就可以动态的创建出来
反射的创建方式
- 通过类名创建
Class<Test> aClass = Test.class;
- 通过对象创建
Test test = new Test(); Class<? extends Test> aClass1 = test.getClass();
- Class.forName()创建
Class<?> aClass = Class.forName(className);//字符串形式全路径
常用方法
- 获取包名类名
clazz.getPackage().getName()//包名 clazz.getSimpleName()//类名 clazz.getName()//完整类名
- 获取成员变量定义信息
getFields()//获取所有公开的成员变量,包括继承变量 getDeclaredFields()//获取本类定义的成员变量,包括私有,但不包括继承的变量 getField(变量名)//可以指定获取一个类公开的所有字段 getDeclaredField(变量名)//可以指定获取一个类的所有字段
- 获取构造方法定义信息
getConstructor(参数类型列表)//获取公开的构造方法 getConstructors()//获取所有的公开的构造方法 getDeclaredConstructors()//获取所有的构造方法,包括私有 getDeclaredConstructor(int.class,String.class)//根据参数获取对应的构造方法
- 获取方法定义信息
getMethods()//获取所有可见的方法,包括继承的方法 getMethod(方法名,参数类型列表) getDeclaredMethods()//获取本类定义的的方法,包括私有,不包括继承的方法 getDeclaredMethod(方法名,int.class,String.class)
- 反射新建实例
clazz.newInstance();//执行无参构造创建对象 clazz.newInstance(12,"蟑螂恶霸");//执行含参构造创建对象
- 反射调用成员变量
clazz.getDeclaredField(变量名);//获取变量 clazz.setAccessible(true);//使私有成员允许访问 f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null
- 反射调用成员方法
Method m = Clazz.getDeclaredMethod(方法名,参数类型列表); m.setAccessible(true);//使私有方法允许被调用 m.invoke(实例,参数数据);//让指定实例来执行该方法
最后启动你的idea敲起来叭~
Q.E.D.