什么是反射?

概念: 反射是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.getConstructor(int.class,String.class)//获取构造方法
    
  • 反射调用成员变量
    clazz.getDeclaredField(变量名);//获取变量
    clazz.setAccessible(true);//使私有成员允许访问
    f.set(实例,值);//为指定实例的变量赋值,静态变量,第一参数给null
    f.get(实例);//访问指定实例变量的值,静态变量,第一参数给null
    
  • 反射调用成员方法
    Method m = Clazz.getDeclaredMethod(方法名,参数类型列表);
    m.setAccessible(true);//使私有方法允许被调用
    m.invoke(实例,参数数据);//让指定实例来执行该方法
    

最后启动你的idea敲起来叭~

Q.E.D.

同是风华正茂,怎可甘拜下风