之前对这个概念一直似懂非懂,看网上的答案是,通过new方法在编译时绑定类,而反射是程序运行时绑定类。这个回答是没问题,但是看完还是有点懵逼。
看了一堆介绍和示例,理解之后自己真被自己蠢哭了。这句话主要是要理解动态的含义。
new方法创建实例:
TargetObject o = new TargetObject();
new后面你必须明确写一个类名。
反射方法:
首先是拿到一个class对象
Class<?> myClass = Class.forName("classPath");
然后网上很多教程实例化对象
TargetObject targetObject = (TargetObject) tagetClass.newInstance();
我的思路就被这一步误导了,说好的动态呢?说好的反射可以在不知道具体实例化哪个类的时候,去实例化对象呢?怎么这里又出现了一个确定的类TargetObject?这跟用new有啥区别啊!
原来真实的用法是这样的:
String classPath="grammar.reflection.TargetObject";
String fieldName="value";
//通过类路径获取
Class myClass = Class.forName(classPath);
//实例化对象
Object o=myClass.newInstance();
//获取类的属性并赋值
Field myField = myClass.getDeclaredField(fieldName);
myField.setAccessible(true);
myField.set(o, "haha");
//打印结果
System.out.println(o);
除了classPath和fieldName,下面的实例化对象以及给属性赋值操作,是不是没有出现跟类任何相关的信息?动态之所以叫动态,就是因为classPath和fieldName是变量,根据你传进去不同的classPath,就可以动态实例化出来不同的类。