例如类似于
obj.callme("abc",function(){自定义代码});
运行后内部也运行了那个匿名函数。
当然java由于语言本省的限制,是很难实现和上面完全一样的。
不过我们可以模拟一下。
定义一个类:
import java.lang.reflect.Method;
public class MethodObject
{
private Object target;//
private String method_name;
public MethodObject(){}
public MethodObject(Object target, String methodName) {
super();
this.target = target;
this.method_name = methodName;
}
public MethodObject(Object target) {
super();
this.target = target;
}
public static MethodObject function(Object target, String methodName,Object...objects)
{
MethodObject mo=new MethodObject( target, methodName);
// mo.invoke(objects);
return mo;
}
public static MethodObject function(Object target,Object...objects)
{
MethodObject mo=new MethodObject( target);
// mo.invoke(objects);
return mo;
}
public Object invoke(Object... objects)
{
Class clazz = target.getClass();
try {
Method[] ms = clazz.getDeclaredMethods();
Method targetMethod = null;
if(method_name==null&&ms.length==1)
{
targetMethod=ms[0];
}
else if(method_name!=null&&ms.length>=1)
{
for(Method m : ms){
if(method_name.equals(m.getName())){
targetMethod = m;
break;
}
}
}
else
{
return null;
}
targetMethod.setAccessible(true);
return targetMethod.invoke(target, objects);
} catch (Exception e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
}
public void rebund(Object anothertarget){
target = anothertarget;
}
public Object getTarget()
{
return target;
}
public void setTarget(Object target)
{
this.target = target;
}
public String getMethod_name()
{
return method_name;
}
public void setMethod_name(String method_name)
{
this.method_name = method_name;
}
}
之后我们就可以测试使用:
public class test
{
public static void main(String[] args)
{
test te=new test();
te.isNotTrue(function(new Object(){
public String sysout(String jk)
{
return jk;
}
}),"哈哈 ");
}
public void isNotTrue(MethodObject me,String abc)
{
System.out.println("i am here");
System.out.println(me.invoke(abc));
System.out.print("wo cool");
}
}
输出结果:
i am here
哈哈
wo cool
这里面用了几项技巧:静态导入,反射,不定参数,通过他们,就可以很好的封装模板代码。
现在让我们分析一下,先充test类开始,说白了,我就是想在 isNotTrue方法里面插入一段自定义的代码,或者说传入一个方法的调用,而到底执行什么是事先不确定的。
( 同时这是回调的一种很好的方式,比如很多框架都可以自定义在执行某些方法的核心代码之前你可以做覆盖某个方法做预处理等,这个都可以用上面的的代码实现)
那么我们如何实现呢?
我们给main方法里的isNotTrue传了两个参数
分别是
MethodObject :
function(new Object(){
public String sysout(String jk)
{
return jk;
}
})
Stirng:
"哈哈"
function是MethodObject中的静态方法,返回MethodObject 实例。MethodObject实例可以调用new Object(){}中的方法,如果你只是在new Object(){}定义一个方法,你无需指定是什么方法 MethodObject知道怎么调用哪一个,如果你定义了多个,那么你就得多指定一个参数,告诉他,是调用Object的哪一个方法。
那么这个就实现了在在isNotTrue方法中实现方法的传递了。
其实我们可以比较下javascript,在JavaScript你可以这样做
function parent(child,other){child();alert(other)}
这里child明显是一个函数。
我们调用parent可以这样
parent(function(){alert(0)},"me");
其实质就是实现了方法的传递。javascript的一等公民是函数,自然可以将函数做为参数传递给别人。
但是java则不可以,只能传递对象,应为Java是完全面向对象的。这就使得像Java那样传递一个简单
的匿名函数很困难,必须通过对象进行封装,在通过对象调用需要的方法。这时候对象成了一个中间的过程
,而且很繁琐。
上面的方法只是对javascript函数传递的一个模拟,但已经很简化了,只需通过给一个静态方法传递一个一个新建的
匿名对对象即可。唯一比javascript繁杂的地方时我们需要的函数外面包裹了两层,new Object以及静态方法function.
不过我想代码已经很少了了。呵呵。
具体实现大家可以再看看上面的代码。应该可以直接使用的。
分享到:
相关推荐
ASP JAVA 动态参数传递 实现动态网页
java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo
用传参数的方法实现Java对SQLite的添加和查询(不用拼接sql语句的方法,不用屏蔽单引号,工程包括sqlite-jdbc-3.27.2.1.jar)
Jni中C++和Java的参数传递如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对Jni不甚了解,不知道Jni是做什么的,如何建立一个基本的jni程序,或许可以参考下面下面这些文章:利用VC++6.0实现JNI的最简单的...
主要介绍了Java方法参数传递如何实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java参数传递及值传递实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Java向Runnable线程传递参数方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
该资源包含了一个androidndk实现的java代码中传递参数到c端,简单易懂。
JNI是java调用C++程序的一种实现方法,网上有一些相关的资料,但不一定能适用,这个文档我在学习JNI时综合网上资料总结的,本人亲测能够实现,希望下载的网友有什么问题多多反馈,希望对学习JNI的朋友有所帮助
bat脚本参数传递,实现java -jar apktool.jar -version可以使用apktool -version代替
主要介绍了Java方法的参数传递机制,结合实例形式详细分析了java方法参数传递机制原理、实现方法及操作注意事项,需要的朋友可以参考下
我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,...我们通过例子理解一下Java的值传递: public static void main(String[] args) { int a = 10; int b = 20;
访问一个网站做了参数,如何实现跳转其他页面参数不丢失呢? 文件里有代码!欢迎使用.
Java语言后台实现调用url路径并传参。
GUI两个界面之间的的数据传递-参数传递方式.txt 怎样才能实现两个gui界面之间的数据传递呀? 例如:有两界面:a,b 在a中的一个按钮的callback下得到一组数据x; 我想在b中的一个按钮的callback下用数据x 怎么...
这个一个自定义注解实现给注解传递伪动态参数的小案例,可以在此自定义注解的基础上来记录接口的调用记录。
Android 客户端实现 Java与js 进行交互,互相调用传参等等!
实现从C#后台HTTP Post文件到JAVA后台 JAVA后台接收代码与普能表单上传接收代码一样,这里没有提供。
需求: 在JS中向后台传递数组参数 分析: JS中的数组是弱类型的可以放任何类型... 但是可以使用JSON字符串来实现,在后台把JSON字符串解析成JAVA对象。 也许,你要说如果是复合对象怎么办,比如如下: 代码如下: public
java实现web服务器:(1) 连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。 (2) 请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是...