实现步骤
1.调用方法
2.替换方法
3.返回数据
所需工具
1.luaj.文章尾部有下载地址
2.Eclipse
具体实现
1.新建一个Hello.java类import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.lib.jse.JsePlatform;
public class Hello {
public static String beCall(String str){//被替换方法
str= replaceMethod(str);//调用替换方法
return str;
}
public static String replaceMethod(String str) {
Globals globals = JsePlatform.standardGlobals();
globals.loadfile("C:/luaCallJava.lua").call();//加载电脑C盘中lua文件
LuaValue aver=globals.get(LuaValue.valueOf("replaceMethod"));//调用lua中的替换方法
String result=aver.call(LuaValue.valueOf(str)).tojstring();//获取处理后的数据
return result;
}
}
2.新建luaCallJava.lua文件,并把这文件放到上面hello.java类所指定的路径中(路径可以自己定义)。function replaceMethod(str)
str=str.."我是返回数据"--在原字符后追加一串字符
return str
end
3.调用beCall方法System.out.println(Hello.beCall("the result data:"));//这里以控制台方式显示获取信息
4.测试结果the result data:我是返回数据
技术进阶
如果被调用函数中包含其他函数,应该如何替换呢?那就需要用到luaJ库中的luajava.bindClass函数了,
举个例子:
1.新建个BeCallClass.java类:public class BeCallClass {
public String strcopy(String stra,String strb) {//这是个内部函数,需要实例化该类才能调用
return stra+strb;//该函数实现一个拼接字符串的功能
}
public static String strDelete(String stra,String strb) {//这是个静态函数,直接就可以调用
return stra.replaceAll(strb, "");//该函数实现一个删除原字符串中的strb的字符
}
}
2.修改beCall函数(先测试静态函数):public static String beCall(String str){
str=BeCallClass.strDelete(str,"ert");//调用BeCallClass中的静态函数,删除原字符串中的ert字符
return str;
}
3.替换beCall函数public static String beCall(String str){
str=replaceMethod(str);//替换为我们的函数
return str;
}
4.在lua实现该替换函数function replaceMethod(str)
local BeCallClass=luajava.bindClass("BeCallClass")//绑定BeCallClass类
str= BeCallClass:strDelete(str,"er")//调用BeCallClass类中的静态函数strDelete,不再删除ert而是删除er。
return str
end
6.调用beCall函数System.out.println(beCall("qwert asdf"));
5.输出结果qwt asdf
6.测试调用内部函数
只要将luajava.bindClass("BeCallClass")替换成luajava.newInstance("BeCallClass")即可,然后调用该类中的内部函数strCopy
下面是修改后的lua文件:function replaceMethod(str)
local BeCallClass=luajava.newInstance("BeCallClass")
str= BeCallClass:strCopy(str,"add")//拼接两个字符
return str
end
7.输出结果qwert asdfadd
项目源码
依赖库
参考文章