使用反射调用EJB3

时间:2011-07-28 07:19:28

标签: java reflection ejb-3.0

在EJB3中,我们可以使用java反射来调用它的'方法吗?如果没有,我们可以通过传递服务名称,方法名称和适当的参数来使用Spring来调用EJB3服务方法吗?

3 个答案:

答案 0 :(得分:2)

这里有一个简单的例子。 (我正在使用OC4J)

/* import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;*/

public static void main(String[] args) throws NamingException, 
                                              ClassNotFoundException, 
                                              NoSuchMethodException, 
                                              IllegalAccessException, 
                                              InvocationTargetException, 
                                              InstantiationException {
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
            "oracle.j2ee.rmi.RMIInitialContextFactory");
    env.put(Context.SECURITY_PRINCIPAL, "oc4jadmin");
    env.put(Context.SECURITY_CREDENTIALS, "welcome");
    env.put(Context.PROVIDER_URL, "ormi://127.0.0.1:23891");

    InitialContext ctx = new InitialContext(env);

    Object obj = 
        ctx.lookup("mypackagename.MyEJBInterfaceName"); 
    Class clazz = obj.getClass();
    System.out.println("Creating method...");
    Method mthd = clazz.getMethod("methodsName", null); /* without parameters in this case (public void methodsName() {...}) */
    System.out.println("the call...");
    mthd.invoke(obj, null);
    System.out.println("end...");
}

答案 1 :(得分:0)

是的,我们可以使用反射来调用EJB3方法。使用JNDI获取对该bean的引用,然后使用反射来调用。

答案 2 :(得分:0)

此代码适用于我。我用反射消耗了一个ejb。

public class UTClasesReflects {
public Object retornaInvoc(String clase, String metodo,String contexto){
    Class <?> remoto=null;
    Proxy ed=null;
    Object obj=null;
    Method me=null;
    UTCargaContextos utctx=null;
    try {
        utctx=UTCargaContextos.instancia();
        obj=utctx.retornaContexto("wls_ejb_rs");//this method return jndi context, it's the same that ctx.lookup("jndiname");
        ed=(Proxy) obj;
        remoto=Class.forName(clase);
        me=remoto.getMethod(metodo);
        byte[] val=(byte[]) me.invoke(ed);
        for (int i = 0; i < val.length; i++) {
            System.out.println((char)val[i]);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return obj;
}
public static void main(String[] args) {
    UTClasesReflects a = new UTClasesReflects();
    a.retornaInvoc("org.ve.bcv.extra.cta.producers.ConsumerRespuestaRemote","buscaRespuesta","wls_ejb_rs");

}
}