反射

1.什么是反射

能动态的获取类的所有成员(属性和方法)的一种途径,即把java类中的各种成分映射成一个个的java对象

2.获取Class实例的3种方式

比如有个User类,然后全路径名为cn.tfjy.com.User

  1. Class uClass = User.class
  2. Class<?> uClass = Class.forName(“cn.tfjy.com.User”);
  3. User user = new User(); Class uClass = user.getClass()

一个类在虚拟机中只有一份字节码

3.Class的有关API使用

3.1 Constructor构造函数

3.1.1 获取构造函数

  1. Constructor[] uCons = uClass.getConstructors()
  2. Constructor[] uCons =uClass.getDeclaredConstructors()
  3. Constructor uCon =uClass.getConstructor(Class<?>… parameterType)
  4. Constructor uCon = uClass.getDeclaredConstructor(Class<?>… parameterType)

3.1.2 创建对象

  1. 调用构造器创建对象 User user = uCon.newInstance(Object…initargs)
  2. 如果类中构造器可直接访问,且没有参数,可以直接用字节码创建对象:User user= uClass.newInstance()

3.2 Field成员变量

3.2.1 获取字段

  1. Fields[] uFields = uClass.getFields()
  2. Fields[] uFields =uClass.getDeclaredtFields()
  3. Fields uField =uClass.gettField(String fieldName)
  4. Fields uField = uClass.getDeclaredtField(String fieldName)

3.2.2 给字段复制

  1. 给基本类型复制:uField.setInt(uClass.newInstance,1)
  2. 给一你用类型复制:uField.set(uClass.newInstance,“反射”)

3.3 Method方法

3.3.1 获取方法

  1. Method[] uMethods = uClass.getMethods()
  2. Method[] uMethods =uClass.getDeclaredMethods()
  3. Method uMethod =uClass.getMethod(uClass.newInstance(),Class<?>… parameterTypes)
  4. Method uMethod= uClass.getDeclaredMethod(uClass.newInstance(),Class<?>… parameterTypes)

3.3.2 调用方法

  1. 调用普通的方法:Object o
    =uMethod.invoke(uClass.newInstance(),Object…args);
  2. 调用静态方法:Object o
    =uMethod.invoke(null,Object…args);也可以像调用普通方法一样传对象

注意:

  1. 在调用私有方法/给私有字段赋值时,必须设置setAccessible(true)
  2. 对于数组类型的引用类型的参数,底层会自动解包,为了解包,使用Object的一维数组把实际参数包起来

4.反射在哪用

多用于框架,软件中,写出复用性高的程序,比如Spring的IOC,mybatis

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值