运用反射实现ejb动态委派

每个bean可能会有很多方法,一般我们通过一个delegate来调用sessionbean中的方法,而非直接调用sessionbean,delegate中只是简单的对每个相对应的sessionbean的public方法的简单封装,在调用的时候省去了每次对home的查找和ejb对象的create,但是可能我们的bean会有很多方法,如果每个bean都写这样一个delegate,这样工作量就会很大,而且也不便于以后系统的移植,比如说,原来使用ejb实现,现在要改用jdo直接操作数据库,而通过运用java的reflect技术,就能较好地实现这些要求。首先,定义了一个FacadeDelegate的抽象类,用来实现对sessionbean的home的查找,代码如下:

import javax.ejb.*;
   import testejb.util.common.*;
   import testejb.util.resource.*;
   public abstract class FacadeDelegate{
    private static String type = Resource.RemoteType;
    public FacadeDelegate() {
    }
    public EJBHome getHome(String jindiName,Class className)
    {
     EJBHome home = null;
     ServerLocatorAdapter adapter = ServerLocatorAdapter.getInstance();
     try
     {
      home = (EJBHome)adapter.getHome(type, jindiName, className);
     }
     catch(Exception e)
     {
      System.err.println(e.getMessage() + jindiName + className.toString());
     }
     return home;
    }
   }

其中ServerLocatorAdapter是一个用来根据是local还是remote调用ejb对象而通过不同的方法查找home的类,如果type为local则调用LocalServerLocate中的方法,如果type为remote则调用RemoteServerLocate中的方法,获得home。代码如下:

import java.util.*;
   import java.lang.reflect.*;
   import testejb.util.resource.*;
   public class ServerLocatorAdapter {
    private Map cache;//用来缓存home
    private static ServerLocatorAdapter me;
    public static ServerLocatorAdapter getInstance()
    {
     if(me == null)
      me = new ServerLocatorAdapter();
     return me;
    }
    //取得home
   public Object getHome(String type,String jndiHomeName,Class className) throws Exception
    {
     Object home = null;
     if(cache.containsKey(jndiHomeName))
      return cache.get(jndiHomeName);
     if(Resource.LocalType.equals(type))
     {
      home = getLocalHome(jndiHomeName,className);
      cache.put(jndiHomeName,home);
      return home;
     }
     if(Resource.RemoteType.equals(type))
     {
      home = getRemoteHome(jndiHomeName,className);
      cache.put(jndiHomeName,home);
      return home;
     }
     return home;
    }
    //取得local home
    private Object getLocalHome(String jndiHomeName,Class className) throws Exception
    {
   Class myClass = Class.forName(Resource.LocalClass);
   // Resource. LocalClass =”testejb.util.common. LocalServerLocator
   Method method = myClass.getMethod(Resource.LocalConstractMethod,null);
   // Resource. LocalConstractMethod =” getInstance”
     LocalServerLocator local = null;
     local = (LocalServerLocator)method.invoke(myClass,null);
     return local.getLocalHome(jndiHomeName,className);
   }
   //取得remote home
    private Object getRemoteHome(String jndiHomeName,Class className) throws Exception
    {
   Class myClass = Class.forName(Resource.RemoteClass);
   // Resource.RemoteClass =”testejb.util.common.RemoteServerLocator”
   Method method = myClass.getMethod(Resource.RemoteConstractMethod,null);
   // Resource.RemoteConstractMethod=” getInstance”
     RemoteServerLocator remote = null;
     remote = (RemoteServerLocator)method.invoke(myClass,null);
     return remote.getHome(jndiHomeName,className);
    }
    private ServerLocatorAdapter() {
     // 为cache提供线程安全的保证
     cache = Collections.synchronizedMap(new HashMap());
    }
   }

时间: 2024-10-27 12:18:30

运用反射实现ejb动态委派的相关文章

【java】java反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明【可用于微信支付 签名生成】

方法1:通过get()方法获取属性值   package com.sxd.test.controller; public class FirstCa{ private Integer num; private String name; private Boolean flag; public Integer getNum() { return num; } public void setNum(Integer num) { this.num = num; } public String getN

学习反射中的动态创建对象

Assembly的CreateInstance有三个重载,第一个参数需要是一个字符串表示的完整的类名.第二个参数是一个bool类型,如果为true,表示对第一个参数不区分大小写. 第三个: 影响执行搜索的方式的位屏蔽.此值是 System.Reflection.BindingFlags 中的位标志的组合. // binder: 一个启用绑定.参数类型强制.成员调用以及通过反射进行 MemberInfo 对象检索的对象.如果 binder 为 null,则使用默认联编程序.// args: Obj

利用反射,实现动态调用winform窗体!!

动态 实用前提:在WinForm程序中,通过主窗体的Menu打开不同的窗体我以前的做法:在Menu的Click事件中,创建打开窗体的对象实例这样的缺点,我不说了:)看看利用反射动态调用窗体对象的方法:private void CreateForm(string strName){ this.Cursor = Cursors.WaitCursor; string path=AssemblyName;//项目的Assembly选项名称 string name=strName; //类的名字 Form

堆栈 日志 反射-java能否动态的在程序中获得出错的值(入参)

问题描述 java能否动态的在程序中获得出错的值(入参) 现在想对项目中的日志进行改造.方便出问题时的解决效率.(出问题时每次都要对错误进行复现.尤其是流程很长的时候.花了大量的时间和精力). 举个简单的例子. public class 人 { private String 身高; private String 体重; private int 年龄; public String get身高() { return 身高; } public void set身高(String 身高) { this.

PHP中使用反射机制实现动态代理

演示用代码如下所示 <?php classClassOne{ functioncallClassOne(){ print"InClassOne"; } } classClassOneDelegator{ private$targets; function__construct(){ $this->target[]=newClassOne(); } function__call($name,$args){ foreach($this->targetas$obj){ $r

Java反射机制(四):动态代理

一.静态代理 在开始去学习反射实现的动态代理前,我们先需要了解代理设计模式,那何为代理呢? 代理模式: 为其他对象提供一种代理,以控制对这个对象的访问. 先看一张代理模式的结构图: 简单的理解代理设计: 一个操作接口有两个子类,其中一个真实主题的实现类,另一个是代理类,代理实现类要完成比真实主题实现类更多的内容,而且本身还需要处理一些与具体业务有关的程序代码. 静态代理示例: package org.chen.yuan.prox; interface Subject {     public S

java 反射和动态代理详解及实例代码_java

一.java中的反射 1.通过反射加载类的属性和方法实例代码: /** * java.lang.Class 是反射的源头 * 我们创建了一个类,通过编译(javac.exe)生成对应的class文件,之后我们通过java.exe加载(jvm的类加载器加载)此class文件 * 此class文件加载到内存后,就是一个运行时类,存在缓存区,这个运行时类本事就是一个Class的实例 * 每一个运行时类只加载一次, */ Class<StudentExam> clazz = StudentExam.c

Java通过反射机制动态设置对象属性值的方法_java

/** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

通过java反射机制动态调用某方法的总结(推荐)_java

如下: public Object invokeMethod(String className, String methodName, Object[] args) throws Exception{ Class ownerClass = Class.forName(className); Object owner = ownerClass.newInstance(); Class[] argsClass = new Class[args.length]; for (int i = 0, j =