记一篇IT培训日记048-关于反射思考

03月31日  月末了想回家   没心情

        又是一天上课,刀哥今天讲反射,玄之又玄的东东,一天下来,脑袋胀胀的,说不出懂还是不懂,这应该是别人说的似懂非懂吧。说懂,能理解java反射具体概念,会使用它对应的api,说不懂,就疑惑它为啥而存在,运用在哪些场景中。

        观察班上同学的表情,估计大家情况类似,这不,小胖又来了。

        小胖:叶子哥,来给哥解释解释,反射是个啥大白话讲一下啊~

        我:你当我是啥,大白话说来就来啊。反射我的理解是对java类,java构造器,java方法,java属性的进一步抽象。比如:根据所有类的特性抽象出字节码对象:Class,根据所有java构造器特性抽象出构造器类:Constructor,根据所有java方法特性抽象出方法类:Method,根据所有的java属性抽象出属性类:Feild。而这些类的实例又可以实现普通类,普通方法,普通属性操作。简单的理解Java提供2套操作的api,一套常规操作,一套反射操作。比如下面的例子:

public class User{
    private String username;
    public User(){
        System.out.println("调用构造器,创建了对象....");
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public void doWork(){
        System.out.println("doWork.....");
    }
}

public class DemoTest {
    public static void main(String[] args) throws Exception {
        User user = new User(); //构建对象
        user.setUsername("叶子"); //设置属性
        System.out.println(user.getUsername()); //获取属性
        user.doWork(); //执行方法

        System.out.println("-----------------------------");
        Class<User> userClz = User.class;
        //获取构造器对象
        Constructor<User> constructor = userClz.getConstructor();
        //通过构造器创建实例对象
        User user1 = constructor.newInstance();

        //获取属性
        Field field = userClz.getDeclaredField("username");
        field.setAccessible(true); //打破私有限制
        field.set(user1, "叶子");  //设置属性
        System.out.println(field.get(user1)); //获取属性

        //获取方法
        Method doWork = userClz.getDeclaredMethod("doWork");
        doWork.invoke(user1); //执行方法
    }
}

   执行结果

调用构造器,创建了对象....
叶子
doWork.....
-----------------------------
调用构造器,创建了对象....
叶子
doWork.....

从上测试结果上看,确实可行啊。

        小胖:那反射为啥要做这种脱裤子放屁你,一套不就完了么?非要再整一套骚操作。

        我:我怎知道,你问刀哥呗,他能讲得出个所以然啦。

        说完,举起手啦~刀哥慢悠悠过来了

        小胖:刀哥,不不~老师,java 整一套反射用来干啥。

        刀哥:闲的蛋疼呗~

        小胖:刀哥,你确定?

        刀哥:你真信啊?业内有句话:反射机制是Java框架的基石,框架很多方便的操作都是使用反射啊。

        小胖:刀哥,你说跟没说有区别么~

        刀哥:我去,话都给你说啦,我还能说啥,当前还没学到框架,积累的技术点还不够,现在跟你提说动态代理,aop,ioc, di,参数注入这些,是不是一脸懵逼。这些都需要用到反射。

        小胖:......就没有当前阶段的解释么?

        刀哥:let me see  see.

        我:刀哥,可不可以这么理解,之前学习操作方式是用于实现业务代码。反射这种方式是用于实现工具(比如框架)性质的代码。工具(比如框架)性质代码实现需要考虑各种规则约定,各种拓展性等,对代码灵活要求很高,而反射操作方法可以满足,就分2套api啦。

        刀哥:这种解释靠谱。

        小胖:你们说啥啊,我都没听懂。

        我:没啥,就是说,实现业务时候,用我们之前学那套api即可,后续你牛逼啦,要独立设计框架时,就可以用反射啦。

        小胖:不是很懂,你是说,现在不用学反射??

        我:滚~~

        

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪飞yes

我对钱没兴趣~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值