Java高级编程开发之反射机制的应用

了解反射机制之前,我们要明确一点,java语言是面向对象编程的开发语言。所以,在java的世界中,万物皆对象。

那么这样的话,我们在编程开发过程中,所创建的类是不是对象呢?是谁的对象呢?是哪个类的对象呢?

答案是肯定的。类也是对象,它是java.lang.Class的对象。

获取Class类的对象有三种方式:

1.已知其他类的实例,获取Class对象(不常用)

Foo foo = new Foo();

Class c1 = foo.getClass();

2.知道类名获取Class对象

Class c2 = Foo.class;

3.通过类的详细路径获取Class对象

Class c3 = Class.forName("com.imo.test.Foo");

c1、c2、c3是Class的实例对象,官方文档称之为Foo类的类类型(class type)。

利用反射来创建对应类的实例对象

Foo foo = c3.newInstance();

静态加载和动态加载

编译时的加载是静态,运行时的加载就是动态加载。像上面的new Foo(),就是静态加载,在编译的时候,如果Foo类不存在,就会报错,编译不能通过。Class.forName("com.imo.test.Foo")是动态加载,这种方式获取类的实例,编译阶段不会有任何问题,即使Foo类不存在编译也能通过。

反射的定义:能动态获取对象的信息就称为反射。

反射机制的作用

反射极大地提高了程序的扩展性。

在反射机制出现之前,应用程序的拓展性是通过面向对象的多态性实现的(多态包括继承---不同的子类有不同的属性和功能、重载---相同的功能有不同的实现,比如银行存款,既可以现金,也可以支票)。

对于继承实现的扩展性,

如 Animal animal = new Cat();

List list = new ArrayList();

如果是这样的话,必须要new 来创建子类,必须要对功能代码进行修改。这不仅仅影响了整个应用程序的扩展性,而且不利于后期系统的升级和维护。但是,利用反射来实现的话就大不一样了。

比如QQ的发送消息的功能sendMessage(String url);

public viod sendMessage(String url){

           Class c = Class.forName(url);

           Message msg = (Message )c.newInstance();

           msg.send();

}

这样的话,假如要对QQ进行升级,让他可以发送视频消息,只需要视频消息类VideoMessage继承Message,并且知道VideoMessage类的路径,在业务代码中调用功能代码中的sendMessage(String url)的方法就可以。可以知道,无需修改原来版本的任何代码,就可以升级(这就是为什么可以在线升级的原因)。

反射机制给我们设计思想带来了新的启发,即对于功能性代码的开发,我们不能使用传统的静态加载的方式来实现,使用动态加载会很好的降低业务耦合性,能带来更好的扩展性。

 

你可能感兴趣的:(Java,SE)