Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在groovy脚本中扩展java.lang.String_Java_Groovy_Groovyscriptengine - Fatal编程技术网

在groovy脚本中扩展java.lang.String

在groovy脚本中扩展java.lang.String,java,groovy,groovyscriptengine,Java,Groovy,Groovyscriptengine,我有一个相当复杂的问题。我目前正在开发一个ERP系统的应用程序。“我的”脚本语言的功能和语法基于erp系统使用的现有旧脚本语言 因此:我通过调用h.fieldname从ERP获取值,其中h是当前选择的数据集,而fieldname是我希望从中获取字段值的字段名称。 我获取字段值,例如字符串类型。我现在想要的是使用一些基于“旧”语法的函数扩展我检索到的这些字符串 但老实说,我不知道如何实现它,我也找不到任何例子 更新2和解决方案 基于@daggett的答案 package groovy.runtim

我有一个相当复杂的问题。我目前正在开发一个ERP系统的应用程序。“我的”脚本语言的功能和语法基于erp系统使用的现有旧脚本语言

因此:我通过调用
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