由于没有经过专业的java学习,所以我喜欢看各个比较著名的java讲师的视频。最近就是在看方立勋老师的视频,但是在看反射的时候(课时12~16),发现有点问题。
方老师在讲反射的时候说:如果具体要调用的类及类的方法是由使用者传入,而编程者不知道会传入什么,那么这时候就要使用反射。通过反射加载类,然后执行方法。例如jdbc里面数据库驱动类就是用到了反射。
但是方老师的视频里,他所讲的例子却实实在在的使用了new 构造方法,下面是他写的例子:
Class clazz=Class.forName("com.learn.reflect.Person"); ---这个类名和下一行的方法名都是使用者传入的
Method m=clazz.getMethod("print3", String[].class);
Person p=new Person();
m.invoke(p,(Object)new String[]{"1","23"});
当时看完之后还觉得讲的挺好的。但是今天看第二遍时却发现情况不对:Person p=new Person(); 红色区域的这段代码是什么鬼?不是说好的不知道要传入哪个对象吗?怎么就new了对象? 然后请教了坐我旁边的开发员同事,终于搞明白了其实反射不是这样用的,上面的代码根本就不能用来编写反射代码。真正的反射用法是这样:
Class clazz=Class.forName("com.learn.reflect.Person");--首先还是加载目标类
Object obj=clazz.newInstence;
Method m=clazz.getMethod("print3", String[].class); --String[].class和"print3"都是使用者传进来的。
m.invoke(obj,(Object)new String[]{"1","23"});
注:以上讲的是通过反射运行目标类的目标方法。通过反射获得目标类的目标属性的方法因为不需要用到对象,所以可以看方老师的视频。
另:本人没有黑方老师的意思,因为:1.本人不觉的方老师非要清清楚楚的把每个方面都讲到 2.本人也黑不了方老师。本人对于传道授业的方老师很感激,所以称呼他为方老师,受他影响,我也把这点发现分享出来。 12~16这5个课时疵不掩瑕,方老师讲得很详细,关于方法是否有返回值、是不是public的、参数的类型和个数,方老师都详细讲解了该怎样通过反射来调用。