大道至简之反射

什么是反射?

反射操作的是Class类型的对象

反射使我们可以在程序运行时获取类信息,动态创建类,获取一个类的成员变量,并调用成员方法,构造方法

java有的时候在编译时无法确定类的类型或者某些信息
其实应该说成
我们故意不将类信息嵌入代码写死,而是写入比如配置文件,从而降低代码耦合这样就不需要改动代码只需要改变配置
而获得这些信息的方法就是反射

实际应用例子:

比如spring在编译时不知道到底要用哪些bean,是运行时通过xml配置或者注解动态获取类型的信息并生成BeanDefinition,接着使用反射创建,管理bean

还有jdbc的驱动也不是写死的,也是我们在运行期间以反射进行加载的

在比如使用Mybatis使用sql语句从数据库查询的字段,如果没有反射我们只能自己编写代码将字段填充到实体类中
而有了反射我们可以在运行时获得实体类的set方法,并调用使用反射调用set方法,从而自动将字段填充到实体类中

只要关闭安全检查就可以通过反射访问私有字段,调用私有方法

Field field=Myclass.getDeclaredField("name");
field.setAccessible(true);//关闭安全检查,同时可以提升性能
field.set(new myclass(), "pkh"); 

Method[] methods = Myclass.getDeclaredMethods(); 
methods[0].setAccessible(true);
methods[0].invoke(new myclass());

获取Class对象的三种方法

1.对象实例.getClass()

2.类名.Class()

3.Class.forName(String className)

Class中常见方法

  • 获取类名:

    – getName() 获取类的名字(全限定名)

    – getSimpleName() 获取简单的类名(不含包名,不是全限定名)

  • 获取成员变量:

    – getFields() 获取类中所有的成员变量

    – Field getField(成员变量名字) 获取指定的成员变量

    set(Object obj, Object value) obj 给哪个对象的成员变量设置value

    get(Object obj) 获取哪个对象该成员变量的值

  • 获取构造方法:

    – getConstructors() 获取类中所有的构造方法

    – getConstructor(该有参构造所需参数) 获取一个类中指定的构造方法
    获取Constructor后新建对象:construct.newInstance(“参数”);

  • 获取成员方法:

    – getMethods() 获取类中所有的成员方法

    – getMethod(方法名,该方法参数列表) 获取指定方法对象!!!

    Method表示成员方法

  • Object invoke(object obj , Object… args),要使用Method对象进行调用,标识在实例obj上以args为参数调用method方法

    例: method.invoke(new OneClass(),“参数1”,2);

  • 获取实例对象:

    – newInstance() 创建实例对象(默认使用空参构造创建对象)

    – newInstance(有参构造所需参数) 创建实例对象

  • 获得父类Class:getSuperclass(),实现接口:getInterfaces()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值