1.什么是反射
能动态的获取类的所有成员(属性和方法)的一种途径,即把java类中的各种成分映射成一个个的java对象
2.获取Class实例的3种方式
比如有个User类,然后全路径名为cn.tfjy.com.User
- Class uClass = User.class
- Class<?> uClass = Class.forName(“cn.tfjy.com.User”);
- User user = new User(); Class uClass = user.getClass()
一个类在虚拟机中只有一份字节码
3.Class的有关API使用
3.1 Constructor构造函数
3.1.1 获取构造函数
- Constructor[] uCons = uClass.getConstructors()
- Constructor[] uCons =uClass.getDeclaredConstructors()
- Constructor uCon =uClass.getConstructor(Class<?>… parameterType)
- Constructor uCon = uClass.getDeclaredConstructor(Class<?>… parameterType)
3.1.2 创建对象
- 调用构造器创建对象 User user = uCon.newInstance(Object…initargs)
- 如果类中构造器可直接访问,且没有参数,可以直接用字节码创建对象:User user= uClass.newInstance()
3.2 Field成员变量
3.2.1 获取字段
- Fields[] uFields = uClass.getFields()
- Fields[] uFields =uClass.getDeclaredtFields()
- Fields uField =uClass.gettField(String fieldName)
- Fields uField = uClass.getDeclaredtField(String fieldName)
3.2.2 给字段复制
- 给基本类型复制:uField.setInt(uClass.newInstance,1)
- 给一你用类型复制:uField.set(uClass.newInstance,“反射”)
3.3 Method方法
3.3.1 获取方法
- Method[] uMethods = uClass.getMethods()
- Method[] uMethods =uClass.getDeclaredMethods()
- Method uMethod =uClass.getMethod(uClass.newInstance(),Class<?>… parameterTypes)
- Method uMethod= uClass.getDeclaredMethod(uClass.newInstance(),Class<?>… parameterTypes)
3.3.2 调用方法
- 调用普通的方法:Object o
=uMethod.invoke(uClass.newInstance(),Object…args); - 调用静态方法:Object o
=uMethod.invoke(null,Object…args);也可以像调用普通方法一样传对象
注意:
- 在调用私有方法/给私有字段赋值时,必须设置setAccessible(true)
- 对于数组类型的引用类型的参数,底层会自动解包,为了解包,使用Object的一维数组把实际参数包起来
4.反射在哪用
多用于框架,软件中,写出复用性高的程序,比如Spring的IOC,mybatis