例如类似于
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.
不过我想代码已经很少了了。呵呵。
具体实现大家可以再看看上面的代码。应该可以直接使用的。
分享到:
相关推荐
这篇博客文章“JAVA反射参数传递概略”将深入探讨如何使用反射来处理方法参数,尤其是涉及到参数传递的细节。 首先,让我们理解什么是参数传递。在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将...
"Java方法参数传递实现" Java方法参数传递是Java编程语言中一个重要的概念,涉及到方法参数的传递机制。了解Java方法参数传递的实现机制对于Java开发者来说是非常必要的。本文将详细介绍Java方法参数传递的实现机制...
然而,在Java程序与Web页面之间建立有效的参数传递机制,尤其是对于那些不可预知或经常变化的动态参数,成为了一项挑战。传统的手动修改HTML代码来更新参数的方式不仅效率低下,而且容易出错,尤其是在参数频繁变化...
此外,在Java中,还可以使用接口和抽象类来实现参数传递机制。 Java方法参数传递机制原理解析是指Java中方法调用时传递参数的机制,参数传递机制可以分为值传递和引用传递,值传递适用于基本数据类型,引用传递适用...
在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...
### Java的引用与函数参数传递详解 #### 一、Java中的引用基础 在Java中,对象的引用扮演着类似于其他编程语言(如C/C++)中指针的角色,但是Java的引用比传统的指针更加安全且易于管理。这是因为Java的设计者们...
总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...
本文将详细介绍如何通过传递参数的方法实现对SQLite数据库的添加和查询操作,避免直接拼接SQL语句,从而提高代码的安全性和可读性。 首先,确保你的项目已经引入了SQLite的JDBC驱动,如`sqlite-jdbc-3.27.2.1.jar`...
java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo
2. 使用jsp:param实现参数传递 jsp:param可以实现主页面向包含页面传递参数,如下:<jsp:include page="Relative URL"> <jsp:param name="param name" value="paramvalue" /> 还可以实现使用jsp:forward动作做...
在Java中,当一个对象作为参数传递给方法时,实际上是传递了该对象引用的副本,而不是对象本身。这意味着,即使在方法内部改变了对象的属性,原始对象仍然保持不变,因为方法内部操作的是副本引用所指向的对象。例如...
要获取名称,我们需要在解析时利用注解处理器,因为参数名称通常在调试信息(如LocalVariableTable属性)中存储,这部分信息可以通过ClassReader的accept方法传递给ClassVisitor的visitLocalVariableTableAttribute...
为了实现参数传递功能,我们需要了解以下几个关键概念: 1. **HTML文件**: 用于定义Applet的位置和传递参数。 2. **Java Applet**: 实现具体逻辑并显示结果。 ### 二、参数传递机制 #### HTML文件中定义参数 在...
1. **直接传递数组:** 在Java中,当我们想要将一个数组作为参数传递给某个方法时,只需要在方法的参数列表中指定数组类型即可。 ```java public void someMethod(int[] array) { // 方法体 } ``` 上述代码...
本主题涉及两个核心知识点:Java中的参数传递机制以及如何实现杨辉三角的算法。 首先,我们来讨论Java中的参数传递。在Java中,函数参数的传递方式只有两种,即按值传递(Pass by Value)和按引用传递(Pass by ...
因此,在Java语言中参数传递机制的实现方法可以分为两种情况,即按值传递和引用传递。了解Java语言中参数传递机制的原理对于初学者来说非常重要,可以帮助他们更好地理解Java语言的工作机制。 Java语言中参数传递...
在本教程中,我们将探讨如何在Java和HTML的结合中实现值传递,以便在网页上绘制圆圈,这对于初学者来说是一个很好的实践项目。 首先,我们要理解Java和HTML之间的交互。通常,这种交互是通过Servlet或JSP(Java...
Java 语言中的参数传递是一个关键概念,它涉及到方法调用时如何传递数据。Java 有两类参数传递方式:按值传递(by value)和按引用传递(by reference),虽然 Java 没有真正的按引用传递,但其效果类似于 C++ 或 C#...
当我们将 String 型参数传递给方法时,实际上传递的是 String 对象的引用,而不是 String 对象本身。这个引用指向了 String 对象在内存中的真实地址。因此,当我们在方法内部改变 String 对象的值时,实际上是改变了...