尊敬的李老师:
我是您忠实的读者,在学java中对您的 《Java开发实战经典》推崇备至,并向同学推荐了此书,有7个同学购后,给予跟高评价 我个人理解反射中,所有类也是一个对象,是Class类的实例,即类对象,而李老师在该书中提到
1、所有类的对象是Class类的实例
2、Class类是一个类的本身
另外,说是Class.forName(”包名.类名“)比类名.class,类名.getClass()常用,是因为前者可以传入字符串形式,后两个需要一个明确的类, 我个人理解是前者字符串形式的全称类名,后两个就可在使用时,导包 import 包名.类名,也就可以了。
不太理解,请赐教!
1,你先搞清反射是怎么回事。其实就是不用new Inst...语句实例化对象的一个过程。所有的类在JAVAC以后会被调入内存。我们通过forName在内存中扒出这个类,然后通过这个类的构造方法实例化。然后再用类的属性和方法召唤这个对象(一般是都是对象.属性;对象.方法(),些时我们是反着来的,所以叫反射)。举个例子。(此例未写泛型,请忽略泛型问题)List aaa=new ArrayList(); 这是正常的实例化过程。我们可以相像它为顺产。反射就是剖腹产。从对象的产生到属性方法的调用都透着不正常,所以叫反射。
至于为什么Class.forName("包名.类名"这种情况最常用其实是因为方便。我们使用时只提供一个包名.类名的字符串就可以了。剩下的构千方法,方法和属性我们都可以通过反射得到。。这不就是设计模式中的。。。。。。
同学,你好,首先你必须要清楚反射并不仅仅是为了一个实例化对象而存在的(这只是反射的一个作用,但并不是主要作用)。反射的最大核心在于:可以利用“特定的字符串”操作类的结构,例如:编写“包.类”的字符串可以取得实例化对象,编写“setXxx”的字符串可以调用类中的普通方法,或者编写“属性字符串”可以调用类中的属性,这实际上提供的只是一个解耦合的功能(类与类之间不需要明确的new操作),而反射机制在Struts上(可以自动接收内容,调用分发操作)或者Spring上(工IOC、AOP编程)都有体现,所以编写反射就相当于编写程序的开发框架,也就是开发标准。
李老师:您好,你说的意思,我懂。我想弄明白的是:所有类是Class类的实例,还是所有类的对象是Class类的实例(正如Java实战开发经典中所说),我理解是前者。
另外,我查阅一些资料,说Class.forName()在编译阶段可以不需要类已经写完,就可通过编译,在运行时,写完即可。我尝试了一下,以org.cdp.Person类为例,不写,Class.forName(“org.cdp.Person”);编译报错。您不需要解说高深的,我就想明白上面一点和这个Class.forName()最方便在哪
首先Class类实例化对象的最核心特征要结合接口与子类的实例化操作来观察,正常情况下接口对象的实例化操作:接口 对象 = new 子类()。这种做法很直接,但是这种做法有一个最大的缺点那就是一个接口固定一个子类了,所以在这样的情况下,就表示接口与特定子类耦合,所以后来使用了工厂设计模式来解决这种耦合问题,但是为了可以让工厂设计模式可以针对于所有的接口子类对象进行操作,可以利用反射实例化,这样只需要传入字符串,就可以取得接口子类对象,从而让我们的程序变得灵活,不受限于具体的子类。
我个人理解2中不是说class.forName 以外的两种方式需要明确的类,因为它的包名.类名,一样明确。其他两种方法,如果导包是一步,实例化是一步,共两步,而这个只需要一步,所以class.forName省了一步,方便
李老师,讲出了反射的作用,可偏离了我疑惑的1及2两点
同学,可能这样回答有些疑惑,这样吧,你等待我们全新的反射机制讲解,你先看完之后,那里有不懂我给你讲解,可以通过网盘下载离线视频。http://pan.baidu.com/s/1mgMMiy0