直观的说,如果想通过字符串的配置来调用一个方法;那可以使用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# winfrom 带参数与无参数的线程(可更新界面UI) 线程的开启关闭 带参与无参使用 线程更新界面信息
对于调用费时的步骤,可以将其延后到窗体显示之后再加载。使用方法: new DelayLoading(this, new MethodInvoker(DataBind)).Execute();
c#写的浏览器可以看源代码 public void NewNullTabPages() //新建空白页面的方法 ... MethodInvoker mi = new MethodInvoker(this.NewNullTabPages); this.BeginInvoke(mi); Thread.Sleep(20); }
子线程访问UI线程控件的方法 MethodInvoker Invoke
多个线程竞争读写同一个资源往往会造成意想不到的意外结果,UI界面也是一种资源,所以跨线程修改UI界面往往被加以限制。这里采用Task + MethodInvoker的方式完成跨线程对UI对的修改。
MethodInvoker代理 Registry类 RegistryKey类 SendKeys类 SpecialFolder类 SystemInformation类 SystemInformation.ArrangeDirection类 SystemInformation.ArrangeStartingPosition类 ...
new MethodInvoker( //表示一个委托,该委托可执行托管代码中声明为 void 且不接 //受任何参数的任何方法。在对控件的 Invoke 方法进行调用时 //或需要一个简单委托又不想自己定义时可以使用该委托。 delegate ...
Parent.Invoke(new MethodInvoker(delegate { Parent.label1.Text = “成功” ; }));其中,“Parent”是主窗体名称。 这样,我们就是在需要窗体控件产生变化的时候,发消息通知主窗体改变控件。这就完全避免了跨...
MethodInvoker - 负责调用给定的方法。 详细信息以下面的Employee类为例 公共类员工 { 私人 int id; 私人字符串名称; 私人部门; 私人浮动工资; //构造函数... //getters and setters ... 您可以通过以下方式...
MethodInvoker - 调用方法、函数或闭包。 例如,用于调度程序以启动子程序。 动机 假设您不想构建基于规则的服务调度程序(或类似 silex 的 http 路由器),仅在满足特定条件时才调用注册的闭包: $ ...
Me.Invoke(New MethodInvoker(AddressOf THREAD2)) End Sub Private Sub THREAD2() Static j As Integer j = j + 1 TextBox1.Text = " 这是 [线程] 操作" & vbCrLf & _ " Button2被点了: " & j & " 次" & ...
MethodInvoker mi = new MethodInvoker(this.PerChat);//使用MethodInvoker委托跨线程访问 this.BeginInvoke(mi); Thread.Sleep(100); return arryFrom.Count-1; } /// /// 添加发言者的IP到用户列表有的将...
textBox1.Invoke(new MethodInvoker(delegate { textBox1.AppendText(sb.ToString()); })); } 您可能感兴趣的文章:C#在Unity游戏开发中进行多线程编程的方法C#线程处理系列之线程池中的I/O线程解析C#多线程...
4 浏览器网络编程(共两周) 4.1 浏览器工作原理(老师讲解1学时,学生理解1学时) 浏览器工作原理如图4-1所示。 图4-1 浏览器工作原理 (1) 浏览器分析超链指向页面的 URL。 ... (3) 域名系统 DNS 解析出清华大学...
│ spring.xml │ struts.xml │ ├─28个java常用的工具类 │ │ Base64.java │ │ Base64DecodingException.java │ │ CConst.java │ │ CharTools.java │ │ ConfigHelper.java │ │ Counter.java │ │ C...