Java 如果无状态bean方法未在业务接口中声明,如何调用该方法

Java 如果无状态bean方法未在业务接口中声明,如何调用该方法,java,casting,ejb,Java,Casting,Ejb,我面临一个问题,一旦bean实例的方法没有在业务接口中声明,我就无法调用它 基本上,这个问题是在我开始使用另一个团队开发的EJB2.1项目之后出现的。 应用服务器是WebSphereV8 问题如下: 我们有一个抽象类,其中声明了基本的业务函数(如读取、删除、更新等) 当然,每个bean都必须扩展该类并实现抽象方法。 bean也可以有自己的公共方法(实际上也有) 由于某些原因,这些方法没有在业务接口中声明, 然而,所有bean的方法都是通过反射而不是直接调用来调用的(我不知道为什么) 在我看来,反

我面临一个问题,一旦bean实例的方法没有在业务接口中声明,我就无法调用它

基本上,这个问题是在我开始使用另一个团队开发的EJB2.1项目之后出现的。 应用服务器是WebSphereV8

问题如下: 我们有一个抽象类,其中声明了基本的业务函数(如读取、删除、更新等)

当然,每个bean都必须扩展该类并实现抽象方法。 bean也可以有自己的公共方法(实际上也有)

由于某些原因,这些方法没有在业务接口中声明, 然而,所有bean的方法都是通过反射而不是直接调用来调用的(我不知道为什么)

在我看来,反射使系统比它可能的慢得多,但我无法处理架构,因为几乎所有需要的方法对于直接调用都不可见

以下是一个例子:

public abstract class FooAbstract {
    public abstract Object create();
    public abstract void delete(Object x);
}
执行业务逻辑的FooBean类(jndi名称“Foo”):

本地业务接口:

public interface FooLocal extends EJBLocalObject {
    public abstract Object create();
    public abstract void delete(Object x);
}
public interface FooLocalHome extends EJBLocalHome {
   public FooLocal create() throws CreateException;
}
最后是本地家庭接口:

public interface FooLocal extends EJBLocalObject {
    public abstract Object create();
    public abstract void delete(Object x);
}
public interface FooLocalHome extends EJBLocalHome {
   public FooLocal create() throws CreateException;
}
根据架构规范,如果我需要调用另一个EJB的方法,我应该使用一些实用类UtilityBean,它使用反射来分派我的调用

比如:

...
   public static Object dispath(String jndi, String methodname, Object parameters) {
      ...
   }
...
最后,我的问题是: 我想在EJB中直接调用FooBean的额外方法,但如果我这样做:

public void doSomething {
    InitialContext ctx = new InitialContext ();
    FooHome home = (FooHome) ctx.lookup("local:ejb/Foo");
    Object bean = home.create();
    ...
}
“bean”变量中,我得到了对FooBean实例的引用,但我无法调用方法aMethod(),因为它不存在于傻瓜本地接口中


有什么建议吗?

通常您可以使用反射来访问对象的私有方法。但是,变量bean的实际底层对象不是FooBean,而是一个也实现了傻瓜本地的代理对象。如果不将该私有方法添加到接口中,则无法访问该私有方法。

通常可以使用反射来访问对象的私有方法。但是,变量bean的实际底层对象不是FooBean,而是一个也实现了傻瓜本地的代理对象。如果不将该私有方法添加到接口中,则无法访问该私有方法。

谢谢,但我说的不是私有方法,而是公共方法。例如,下一条语句将不起作用:FooBean=(FooBean)((FooHome)ctx.lookup(“local:ejb/Foo”)).create(),但是代理对象实际上与FooBean相同。另一个示例:
InitialContext ctx=new InitialContext();FooHome=(FooHome)ctx.lookup(“local:ejb/Foo”);objectbean=home.create()methodmethod=FooBean.class.getMethod(“aMethod”);调用(bean,新对象[]())它将是有效的…((谢谢,但我说的不是私有方法,而是公共方法。例如,下一个语句将不起作用:FooBean=(FooBean)((FooHome)ctx.lookup(“local:ejb/Foo”))).create(),但是代理对象实际上与FooBean相同。另一个示例:
InitialContext ctx=new InitialContext();FooHome=(FooHome)ctx.lookup(“local:ejb/Foo”);objectbean=home.create();
如果我使用反射,比如
Method=FooBean.class.getMethod(“aMethod”);Method.invoke(bean,newobject[]);
它将起作用((