在groovy脚本中扩展java.lang.String
我有一个相当复杂的问题。我目前正在开发一个ERP系统的应用程序。“我的”脚本语言的功能和语法基于erp系统使用的现有旧脚本语言 因此:我通过调用在groovy脚本中扩展java.lang.String,java,groovy,groovyscriptengine,Java,Groovy,Groovyscriptengine,我有一个相当复杂的问题。我目前正在开发一个ERP系统的应用程序。“我的”脚本语言的功能和语法基于erp系统使用的现有旧脚本语言 因此:我通过调用h.fieldname从ERP获取值,其中h是当前选择的数据集,而fieldname是我希望从中获取字段值的字段名称。 我获取字段值,例如字符串类型。我现在想要的是使用一些基于“旧”语法的函数扩展我检索到的这些字符串 但老实说,我不知道如何实现它,我也找不到任何例子 更新2和解决方案 基于@daggett的答案 package groovy.runtim
h.fieldname
从ERP获取值,其中h
是当前选择的数据集,而fieldname
是我希望从中获取字段值的字段名称。
我获取字段值,例如字符串类型。我现在想要的是使用一些基于“旧”语法的函数扩展我检索到的这些字符串
但老实说,我不知道如何实现它,我也找不到任何例子
更新2和解决方案
基于@daggett的答案
package groovy.runtime.metaclass.java.lang;
import groovy.lang.DelegatingMetaClass;
import groovy.lang.MetaClass;
public class StringMetaClass extends DelegatingMetaClass {
public StringMetaClass(Class<?> theClass) {
super(theClass);
}
public StringMetaClass(MetaClass metaClass) {
super(metaClass);
}
@Override
public Object invokeMethod(Object object, String name, Object[] args) {
// implementiert "test" >> 3
if (name.equals("rightShift")) {
if (args.length == 1) {
if (args[0] instanceof Integer) {
String str = object.toString();
int x = ((Integer) args[0]).intValue();
if (str.length() > x) {
return str.substring(str.length() - x);
}
return str;
} else {
throw new IllegalArgumentException("wrong argument type, should be integer");
}
} else {
throw new IllegalArgumentException("too many arguments");
}
}
// implementiert "test" << 3
if (name.equals("leftShift")) {
if (args.length == 1) {
if (args[0] instanceof Integer) {
String str = object.toString();
int x = ((Integer) args[0]).intValue();
if (str.length() > x) {
return str.substring(0,x);
}
return str;
} else {
throw new IllegalArgumentException("wrong argument type, should be integer");
}
} else {
throw new IllegalArgumentException("too many arguments");
}
}
else {
return super.invokeMethod(object, name, args);
}
}
}
包groovy.runtime.metaclass.java.lang;
导入groovy.lang.DelegatingMetaClass;
导入groovy.lang.MetaClass;
公共类StringMetaClass扩展了DelegatingMetaClass{
公共字符串元类(类){
超级(类);
}
公共字符串元类(元类元类){
超级(元类);
}
@凌驾
公共对象调用方法(对象对象、字符串名称、对象[]参数){
//实施者“测试”>>3
if(name.equals(“rightShift”)){
如果(args.length==1){
if(args[0]instanceof Integer){
String str=object.toString();
intx=((整数)参数[0]).intValue();
如果(str.length()>x){
返回str.substring(str.length()-x);
}
返回str;
}否则{
抛出新的IllegalArgumentException(“错误的参数类型,应该是整数”);
}
}否则{
抛出新的IllegalArgumentException(“太多参数”);
}
}
//实施者“测试”x){
返回str.substring(0,x);
}
返回str;
}否则{
抛出新的IllegalArgumentException(“错误的参数类型,应该是整数”);
}
}否则{
抛出新的IllegalArgumentException(“太多参数”);
}
}
否则{
返回super.invokeMethod(对象、名称、参数);
}
}
}
不能扩展string类,因为它是final类,但在groovy中,可以在元类的帮助下向string类添加新方法
String.metaClass.rightShift = { int x-> delegate[-x..-1] }
"1234567890" >> 3
返回
890
用同样的方法实现方法
leftShift
,以感谢:)。有没有办法将其包含在我的基类(用java编写)中?magic包是一个很好的方法:或者使用GroovySystem.getMetaClassRegistry().setMetaClass(String.class,new DelegatingMetaClass(Relationship.class){…})
magic包工作正常!非常感谢你!!!
String.metaClass.rightShift = { int x-> delegate[-x..-1] }
"1234567890" >> 3
890