`
hbkh2000
  • 浏览: 203711 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用反射实现类的动态加载

阅读更多

利用反射实现类的动态加载[转]

<!--<iframe src="http://blog.iyi.cn/start/firefox_ad.html" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" scrolling="no" allowtransparency="true" height="60" width="115"></iframe><iframe src="http://blog.iyi.cn/start/archive_ad.html" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" scrolling="no" allowtransparency="true" height="60" width="468"></iframe>-->
Author: | <script src="http://blog.iyi.cn/js/English.js" type="text/javascript"></script>English Version 【转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
URL:

 

Bromon原创 请尊重版权

最近在成都写一个移动增值项目,俺负责后台server端。功能很简单,手机用户通过GPRS打开Socket与服务器连接,我则根据用户传过来的数据做出响应。做过类似项目的兄弟一定都知道,首先需要定义一个类似于MSNP的通讯协议,不过今天的话题是如何把这个系统设计得具有高度的扩展性。由于这个项目本身没有进行过较为完善的客户沟通和需求分析,所以以后肯定会有很多功能上的扩展,通讯协议肯定会越来越庞大,而我作为一个不那么勤快的人,当然不想以后再去修改写好的程序,所以这个项目是实践面向对象设计的好机会。

 

 

 

 

 

 

 

 

       首先定义一个接口来隔离类:

 

 

 

 

package org.bromon.reflect;

 

 

 

public interface Operator

{

       public java.util.List act(java.util.List params)

}

 

 

 

根据设计模式的原理,我们可以为不同的功能编写不同的类,每个类都继承Operator接口,客户端只需要针对Operator接口编程就可以避免很多麻烦。比如这个类:

 

 

 

package org.bromon.reflect.*;

 

 

 

public class Success implements Operator

{

       public java.util.List act(java.util.List params)

       {

              List result=new ArrayList();

              result.add(new String(“操作成功”));

              return result;

       }

}

 

 

 

我们还可以写其他很多类,但是有个问题,接口是无法实例化的,我们必须手动控制具体实例化哪个类,这很不爽,如果能够向应用程序传递一个参数,让自己去选择实例化一个类,执行它的act方法,那我们的工作就轻松多了。

 

 

 

很幸运,我使用的是Java,只有Java才提供这样的反射机制,或者说内省机制,可以实现我们的无理要求。编写一个配置文件emp.properties:

 

 

 

#成功响应

 

 

1000=Success

 

 

 

 

 

#向客户发送普通文本消息

 

 

2000=Load

 

 

 

 

 

#客户向服务器发送普通文本消息

 

 

3000=Store

 

 

 

 

 

文件中的键名是客户将发给我的消息头,客户发送1000给我,那么我就执行Success类的act方法,类似的如果发送2000给我,那就执行Load类的act方法,这样一来系统就完全符合开闭原则了,如果要添加新的功能,完全不需要修改已有代码,只需要在配置文件中添加对应规则,然后编写新的类,实现act方法就ok,即使我弃这个项目而去,它将来也可以很好的扩展。这样的系统具备了非常良好的扩展性和可插入性。

 

 

 

下面这个例子体现了动态加载的功能,程序在执行过程中才知道应该实例化哪个类:

package org.bromon.reflect.*;

import java.lang.reflect.*;

public class TestReflect

{

       //加载配置文件,查询消息头对应的类名

 

 

       private String loadProtocal(String header)

 

 

    {

 

 

        String result=null;

 

 

       try

 

 

       {

 

 

           Properties prop=new Properties();

 

 

           FileInputStream fis=new FileInputStream("emp.properties");

 

 

           prop.load(fis);

 

 

           result=prop.getProperty(header);

 

 

           fis.close();

 

 

        }catch(Exception e)

 

 

       {

 

 

           System.out.println(e);

 

 

       }

 

 

        return result;

 

 

    }

 

 

 

 

 

    //针对消息作出响应,利用反射导入对应的类

 

 

    public String response(String header,String content)

 

 

    {

 

 

        String result=null;

 

 

        String s=null;

 

 

       try

 

 

       {

 

 

           /*

 

 

            * 导入属性文件emp.properties,查询header所对应的类的名字

 

 

            * 通过反射机制动态加载匹配的类,所有的类都被Operator接口隔离

 

 

            * 可以通过修改属性文件、添加新的类(继承MsgOperator接口)来扩展协议

 

 

            */

 

 

           s="org.bromon.reflect."+this.loadProtocal(header);

 

 

 

 

 

           //加载类

 

 

           Class c=Class.forName(s);

 

 

           //创建类的事例

 

 

           Operator mo=(Operator)c.newInstance();

 

 

           //构造参数列表

 

 

           Class params[]=new Class[1];

 

 

           params[0]=Class.forName("java.util.List");

 

 

           //查询act方法

 

 

           Method m=c.getMethod("act",params);

 

 

           Object args[]=new Object[1];

 

 

           args[0]=content;

 

 

           //调用方法并且获得返回

 

 

           Object returnObject=m.invoke(mo,args);

 

 

        }catch(Exception e)

 

 

       {

 

 

           System.out.println("Handler-response:"+e);

 

 

       }

 

 

        return result;

 

 

    }

 

 

 

 

 

    public static void main(String args[])

 

 

    {

 

 

        TestReflect tr=new TestReflect();

 

 

        tr.response(args[0],”消息内容”);

 

 

    }

 

 

}

 

 

 

测试一下:java TestReflect 1000

       这个程序是针对Operator编程的,所以无需做任何修改,直接提供Load和Store类,就可以支持2000、3000做参数的调用。

        有了这样的内省机制,可以把接口的作用发挥到极至,设计模式也更能体现出威力,而不仅仅供我们饭后闲聊。

分享到:
评论

相关推荐

    C#动态加载DLL主要说明如何通过反射实现动态加载DLL

    在.NET框架中,C#程序员...通过以上解释,我们可以理解如何利用反射在C#中动态加载和执行DLL文件,以及在使用过程中需要注意的关键点。动态加载DLL是.NET开发中的一个重要技巧,它使得我们的应用程序更加灵活和可扩展。

    C#实现反射调用动态加载的DLL文件中的方法

    ### C#中使用反射调用动态加载的DLL文件中的...通过以上步骤,我们不仅实现了反射的基本原理,还展示了如何利用反射技术动态地加载和调用DLL文件中的方法,这对于开发过程中需要灵活配置或扩展功能的应用来说非常有用。

    Java反射动态加载实例类

    通过本示例,我们不仅理解了Java反射的基本概念和用途,还学会了如何利用反射动态加载并操作实例类。反射提供了一种灵活的方式来处理类和对象,尤其是在编写框架和插件系统时,能够根据运行时的条件动态地加载和执行...

    利用反射 实现一个自制的struts

    2. 创建并实现Interceptor接口,利用反射实例化和执行拦截器链。 3. 设计并实现Dispatcher,用反射处理请求转发。 4. 解析配置文件,构建Action和拦截器的映射关系。 这样的实践项目对于理解Struts的工作原理和Java...

    利用反射,动态加载DLL,卸载DLL

    本篇将深入探讨如何利用反射动态加载和卸载DLL,以及在实际应用中的场景。 首先,我们需要了解DLL(动态链接库)在Windows操作系统中的作用。DLL文件是一组可重用的函数和数据,多个应用程序可以共享它们,以减少...

    利用反射动态加载dll

    在本例中,我们将讨论如何利用反射动态加载DLL文件,并结合SQL Server数据库来实现这一功能。 首先,我们需要理解动态加载DLL的基本概念。在传统的编程模式中,DLL(动态链接库)是在编译时静态链接到应用程序中的...

    利用反射和代理实现简单的Spring

    `Proxy.newProxyInstance()`方法接受一个类加载器、接口数组和一个`InvocationHandler`,在调用代理对象的方法时,实际调用的是`InvocationHandler.invoke()`。 5. **元数据解析**:Spring使用`...

    C#,利用反射动态创建对象

    本篇文章将深入探讨如何利用反射在C#中动态创建对象。 1. **反射基础** 反射是.NET框架提供的一种特性,通过System.Reflection命名空间中的类来实现。主要类包括Assembly(程序集)、Type(类型)、...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    在使用反射实现AOP动态代理时,我们也需要注意一些问题。例如,由于代理类是在运行时动态创建的,这可能会影响程序的性能,特别是在频繁调用代理方法的情况下。因此,在实际开发中,需要根据应用场景的性能要求和...

    java 利用反射获取内部类静态成员变量的值操作.docx

    ### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...

    通过反射机制实现动态表单

    本篇主要探讨如何利用反射机制实现动态表单,这在处理不确定数据结构或需要动态生成UI的场景中非常有用。 动态表单的实现通常涉及到以下几个关键知识点: 1. **Class类**: Java中的`java.lang.Class`类是每个类的...

    反射实现 AOP 动态代理模式(Spring AOP 的实现 原理) - Java 例子 -

    总结来说,Spring AOP通过动态代理实现了面向切面编程,利用反射在运行时生成代理对象并插入通知代码。这种设计让开发者能够专注于业务逻辑,而不必关心横切关注点的实现细节,提高了代码的可维护性和复用性。理解...

    C# 利用反射动态创建对象

    这可以通过反射实现,首先创建窗体类的DLL,然后在运行时加载该DLL,通过Assembly.CreateInstance()或Activator.CreateInstance()方法创建窗体实例。 7. **组合框(ComboBox)**:在示例中,组合框用于显示可选的...

    利用反射实现JavaBean 的自动赋值

    ### 利用反射实现JavaBean的自动赋值 在软件开发过程中,特别是在Web应用程序的开发中,经常会遇到需要将表单提交的数据绑定到JavaBean对象上的需求。这可以通过多种方式实现,例如使用Spring MVC等框架的自动绑定...

    java 利用java反射机制动态加载类的简单实现

    在上述代码示例中,我们看到了如何利用反射来动态加载类并执行特定方法。以下是关于Java反射机制的详细解释以及代码分析: 1. **Java反射机制**:Java反射API包含在`java.lang.reflect`包中,主要类有`Class`、`...

    Java技术----实现JAVA的动态类载入机制

    在Java编程语言中,动态类加载机制是一种强大...通过自定义类加载器和利用反射API,我们可以实现更高级的功能,比如动态加载和执行类,或者在运行时修改对象的行为。这使得Java成为一个高度适应性和可扩展的编程语言。

    利用类装载器动态加载类并启动类

    3. **启动类**:通过反射调用类的`main`方法,实现类的启动。 ### 示例代码 #### Encrypt 类 ```java public class Encrypt { public static void main(String[] args) throws IOException { FileInputStream in...

    Java类的反射与动态加载

    动态加载则是利用反射技术,在程序运行时动态地加载类并实例化对象,这为Java应用程序提供了高度的灵活性和可扩展性。下面将深入探讨Java类的反射与动态加载相关知识点。 首先,我们要了解什么是类的反射。在Java中...

Global site tag (gtag.js) - Google Analytics