直观的说,如果想通过字符串的配置来调用一个方法;那可以使用spring提供的 MethodInvoker这个对象
示例
package test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.MethodInvoker;
public class AMethodClass {
public static String execute(String str) {
return str.concat("-result");
}
public String execute2(String str) {
return str.concat("-result2");
}
public static void main(String[] args) {
BeanFactory beanfactory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
/*
* 注意看配置文件
* 获取配置的MethodInvoker;这个bean配置的是targetClass,要求targetMethod必须是静态方法
* */
MethodInvoker method = (MethodInvoker) beanfactory.getBean("aMethod");
//下来可以自己手工设置方法参数
Object[] arguments = new Object[1];
arguments[0] = "test";
method.setArguments(arguments);
try {
// 准备方法
method.prepare();
//执行方法
Object result = method.invoke();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
/*
* 注意看配置文件
* 获取配置的MethodInvoker;这个bean配置的是targetObject,则需要先配置一个bean,这里ref到这个bean
* targetMethod可以不是静态的
* */
MethodInvoker method2 = (MethodInvoker) beanfactory.getBean("aMethod2");
//下来可以自己手工设置方法参数
Object[] arguments2 = new Object[1];
arguments2[0] = "test2";
method2.setArguments(arguments2);
try {
// 准备方法
method2.prepare();
//执行方法
Object result = method2.invoke();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
spring配置
<bean id="aMethod" class="org.springframework.util.MethodInvoker">
<property name="targetClass" value="test.AMethodClass" />
<property name="targetMethod" value="execute" />
</bean>
<bean id="aMethod2Class" class="test.AMethodClass" />
<bean id="aMethod2" class="org.springframework.util.MethodInvoker">
<property name="targetObject" ref="aMethod2Class" />
<property name="targetMethod" value="execute2" />
</bean>
但一般情况不直接使用MethodInvoker;而是使用MethodInvokingFactoryBean,具体可参看这2个类的javadoc
示例
package test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.MethodInvoker;
public class AMethodClass {
public static String execute(String str) {
return str.concat("-result");
}
public String execute2(String str) {
return str.concat("-result2");
}
public static void main(String[] args) {
BeanFactory beanfactory = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
/*
* 使用MethodInvokingFactoryBean;相当于spring帮你做了上述逻辑;
* 可以直接获取到方法的执行结果;
* 注意这里是方法的返回值;而不是class本身;这是由于MethodInvokingFactoryBean实现了FactoryBean接口;
* 由接口方法getObject()来获取最终返回的对象
*/
Object aMethod3 = beanfactory.getBean("aMethod3");
System.out.println(aMethod3);
}
}
spring配置
<bean id="aMethod3" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass">
<value>test.AMethodClass</value>
</property>
<property name="targetMethod">
<value>execute</value>
</property>
<property name="arguments">
<list>
<value>test3</value>
</list>
</property>
</bean>
分享到:
相关推荐
MethodInvoker MethodInvokingFactoryBean MethodInvokingJobDetailFactoryBean MethodInvokingJobDetailFactoryBean.MethodInvokingJob MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob ...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高性能的应用程序。本资源包含的是C#多线程操作的范例,旨在帮助开发者理解并掌握多线程编程的关键概念和...
MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread); mi.BeginInvoke(null, null); // 不会阻塞UI线程 } private void RunsOnWorkerThread() { DoSomethingSlow(); } ``` 2. **避免在非UI线程中...
对于调用费时的步骤,可以将其延后到窗体显示之后再加载。使用方法: new DelayLoading(this, new MethodInvoker(DataBind)).Execute();
MethodInvoker simpleDelegate = new MethodInvoker(Foo); // Calling Foo simpleDelegate.Invoke(); ``` 然而,即使我们使用了委托,调用线程仍需要等待Invoke()函数来完成,直至该控件将返回到调用的线程。 ...
本篇将详细讲解如何在子线程中安全地访问UI线程的控件,主要涉及`MethodInvoker`和`Invoke`方法。 1. **线程基础知识**: - **主线程与UI线程**:Windows Forms或WPF应用程序通常有一个主线程,负责创建并维护UI...
c#写的浏览器可以看源代码 public void NewNullTabPages() //新建空白页面的方法 ... MethodInvoker mi = new MethodInvoker(this.NewNullTabPages); this.BeginInvoke(mi); Thread.Sleep(20); }
`Task`是.NET Framework中的一个类,用于表示异步操作,而`MethodInvoker`是一个委托类型,可以用于无参数的方法,使其能在其他线程上执行。 首先,我们需要创建一个`Task`来执行后台任务。后台任务可能是一个长...
在C# WinForm应用开发中,线程的使用是至关重要的,特别是在处理耗时操作时,为了保持用户界面(UI)的响应性,我们通常会使用多线程技术。本主题将详细探讨如何创建带参数和无参数的线程,以及如何在这些线程中安全地...
通过上述代码可以看出,`ISynchronizeInvoke` 接口提供了一个更灵活的方式来同步控件的调用,而 `MethodInvoker` 则简化了委托的创建过程。 #### 结论 跨线程调用控件是C# GUI编程中常见但又容易忽视的问题。正确...
在本文所示的代码中,使用了Thread和MethodInvoker来实现屏幕的控制。Thread是.NET Framework提供的多线程编程类,用于实现多线程编程;MethodInvoker是.NET Framework提供的委托类,用于实现方法的调用。 ...
MethodInvoker workDelegate = new MethodInvoker(DoLongRunningTask); // 使用BeginInvoke异步调用工作方法 Invoke(workDelegate); } private void DoLongRunningTask() { // 这里执行耗时任务 } ``` 然而...
MethodInvoker invoker = new MethodInvoker(form.Close); synchronizer.Invoke(invoker, null); } else { form.Close(); } ``` 在这个例子中,`synchronizer`是一个实现了`ISynchronizeInvoke`接口的对象,这里...
MethodInvoker mi = new MethodInvoker(RunsOnWorkerThread); await Task.Run(() => mi.BeginInvoke(null, null)); // 不会阻塞UI线程 } private void RunsOnWorkerThread() { DoSomethingSlow(); // 在...
例如,使用`MethodInvoker`可以简化代码,`MethodInvoker`是.NET Framework提供的一种无参数的委托类型,适用于更新UI控件。在提供的另一个示例中,`btnOK_Click`事件处理程序启动新线程,新线程中的`threadRun`方法...
在线程的方法中,可以使用BeginInvoke 方法来调用UpdateUI 方法,例如,MethodInvoker mi = new MethodInvoker( this.UpdateUI ); this.BeginInvoke( mi ); 在实际应用中,需要根据具体情况来选择适合的方法来传递...
`MethodInvoker`用于无参数的方法,而`EventHandler`通常用于事件处理,它接受一个`object`和`EventArgs`参数。尽管它们简化了代码,但在需要自定义参数和返回值时可能不够灵活。 在多线程和UI交互中,正确使用委托...
MethodInvoker invoker = new MethodInvoker(form.Close); synchronizer.Invoke(invoker, null); } else { form.Close(); } ``` ISynchronizeInvoke不仅限于Winform窗体,任何需要在特定线程中执行操作的类都...
` 实际上是等价于 `MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });` 的,因为编译器会生成一个内部匿名方法来调用`MyFunc`。 5. **Lambda表达式与LINQ** Lambda表达式在LINQ中起到了关键...
this.Invoke((MethodInvoker)delegate { waitingForm.Close(); MessageBox.Show("登录成功"); }); } else { this.Invoke((MethodInvoker)delegate { waitingForm.Close(); MessageBox.Show("登录失败");...