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即可,后续你牛逼啦,要独立设计框架时,就可以用反射啦。
小胖:不是很懂,你是说,现在不用学反射??
我:滚~~