Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季反射误差_Java_Spring_Web Applications_Reflection - Fatal编程技术网

Java 春季反射误差

Java 春季反射误差,java,spring,web-applications,reflection,Java,Spring,Web Applications,Reflection,实际上,我想调用的是一个服务方法,所以有些人说,通过常规反射,如何加载自动连接的元素?我不熟悉spring框架。我正在开发使用SpringHibernate框架设计的web应用程序。 所以在一个例子中,我在DB中保存了类名和方法名。现在我想通过反射调用方法: Class cls = Class.forName("com.xyz.pqr.Invest"); Object obj = cls.newInstance(); //call the printIt method

实际上,我想调用的是一个服务方法,所以有些人说,通过常规反射,如何加载自动连接的元素?我不熟悉spring框架。我正在开发使用SpringHibernate框架设计的web应用程序。 所以在一个例子中,我在DB中保存了类名和方法名。现在我想通过反射调用方法:

 Class cls = Class.forName("com.xyz.pqr.Invest");


    Object obj = cls.newInstance();

    //call the printIt method
    Method method = cls.getDeclaredMethod("exec", noparams);
    method.invoke(obj, null);
通过从数据库中获取类名和方法名。但这并没有达到我的目的。请告知如何使用spring通过反射调用方法。我用谷歌搜索了一下,找到了一些类似于实现ApplicationContextAware的东西。但不清楚。
实际上,我想调用的是一个服务方法,所以有些人说,通过常规反射,如何加载自动连接的元素?
Invest是一个服务类,因为我们有api exec来处理一些数据

public void exex(int a, int b, String c){**}

谢谢

您需要做的是让调用者应用程序ContextAware,并使用getBean方法获取Invest类的实例,而不是cls.newInstance

像下面这样

public TheCaller implements org.springframework.context.ApplicationContextAware {
    /** The spring application context */
    @Autowired
    private org.springframework.context.ApplicationContext springContext;

    public void callService(String serviceName, String theClass, String methodName) {
       Class cls = Class.forName(theClass);
       Object obj = applicationContext.getBean(serviceName); // Or use applicationContext.getBeansOfType(cls)
       Method method = cls.getDeclaredMethod(methodName, noparams);
       method.invoke(obj, null);
    }    

}

serviceName是在spring中配置的bean的名称。

您需要做的是使调用方应用程序ContextAware并使用getBean方法获取Invest类的实例,而不是cls.newInstance

像下面这样

public TheCaller implements org.springframework.context.ApplicationContextAware {
    /** The spring application context */
    @Autowired
    private org.springframework.context.ApplicationContext springContext;

    public void callService(String serviceName, String theClass, String methodName) {
       Class cls = Class.forName(theClass);
       Object obj = applicationContext.getBean(serviceName); // Or use applicationContext.getBeansOfType(cls)
       Method method = cls.getDeclaredMethod(methodName, noparams);
       method.invoke(obj, null);
    }    

}

serviceName是在spring中配置的bean的名称。

这与spring无关,您应该深入研究java反射。首先检查被调用的类是否可以从被调用方访问。实际上,我想调用的是一个服务方法,所以有些人说,通过常规反射,如何加载自动连接的元素?该方法是否可以访问?exec方法的签名是什么?什么是投资类?你提供的信息对我们来说是非常不够的。您可能需要添加更多的信息,我认为这不会起作用,因为spring使用bean的代理。Invest是一个服务类,因为我们有api exec来处理一些数据,比如exexin a、int b、String c{**}。这与spring无关,您应该深入研究java反射。首先检查被调用的类是否可以从被调用方访问。实际上,我想调用的是一个服务方法,所以有些人说,通过常规反射,如何加载自动连接的元素?该方法是否可以访问?exec方法的签名是什么?什么是投资类?你提供的信息对我们来说是非常不够的。您可能需要添加更多的信息,我认为这是行不通的,因为spring使用beans的代理。Invest是一个服务类,因为我们有api exec来处理一些数据,公共无效的EXEXEXINT a、int b、字符串c{**}