- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我只想在给定的 GroovyShell
上下文中使用自定义 IntegerMetaClass
。
原因是为了不让我的潜在“干扰”IntegerMetaClass
污染整个运行时。
当我将我的 IntegerMetaClass.java 实现放入魔术包 groovy.runtime.metaclass.java.lang
时,它就像一个魅力。但是,当我尝试将它手动添加到中间 GroovyClassLoader 时,它停止工作。
// Pseudo-code without try catch, etc
// Within my eval factory
GroovyClassLoader gcl = new GroovyClassLoader(getClass().getClassLoader());
URL url = getClass().getClassLoader().getResource("groovy/runtime/metaclass/java/lang/IntegerMetaClass.groovy"); // I rename it to .groovy file
GroovyCodeSource gcs = new GroovyCodeSource(url);
Class<?> clazz = gcl.parseClass(gcs);
// clazz is not null here and equals to what I expect:
// Class<groovy.runtime.metaclass.java.lang.IntegerMetaClass>
// Now trying to use it in a groovy shell
GroovyShell gs = new GroovyShell(gcl);
gs.evaluate("10.minutes"); // Where .minutes is part of my IntegerMetaClass
// Fail with an NoSuchProperty exception
在 GroovyClassLoader
上,除了“解析” MetaClass 之外,我是否还想做其他事情?还有其他地方吗?
更新1:
如上所述,IntegerMetaClass.minutes
查找在我将其直接放在我的 java 源类路径中时有效。
package groovy.runtime.metaclass.java.lang;
import groovy.lang.DelegatingMetaClass;
import groovy.lang.MetaClass;
public class IntegerMetaClass extends DelegatingMetaClass {
public IntegerMetaClass(Class<Integer> delegate) {
super(delegate);
}
public IntegerMetaClass(MetaClass delegate) {
super(delegate);
}
@Override
public Object getProperty(Object object, String property) {
if ("minutes".equals(property)) {
Integer q = (Integer) object;
return new Minutes(q);
}
return super.getProperty(object, property);
}
}
更新2:
一个可能但不令人满意的解决方案:
在 gcl.parseClass
调用之后添加以下内容
Constructor<?> constructor = clazz.getConstructor(Class.class);
DelegatingMetaClass dmc = (DelegatingMetaClass) constructor.newInstance(Integer.class);
dmc.initialize();
InvokerHelper.getMetaRegistry().setMetaClass(Integer.class, dmc);
但是这个解决方案必须在 MetaClass 源和原始目标类之间保持一种“映射”,以支持超过 Integer
...
最佳答案
您可以使用 GroovyShell
类加载器加载类:
GroovyShell gs = new GroovyShell()
gs.loader.loadClass('groovy.runtime.metaclass.java.lang.IntegerMetaClass')
gs.evaluate("10.minutes")
注意:当 IntegerMetaClass
是 groovy 文件时,我得到了 java.lang.IncompatibleClassChangeError
,但当它是 java 时没有问题。这可能与我的环境设置有关
关于java - 动态添加 IntegerMetaClass 到 GroovyShell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26526234/
我开始用 groovy 编程,我想知道我什么时候使用 GroovyShell (new File ("script.groovy").txt) .evaluate (), 脚本类是否在类路径中看到依赖
我有一个 groovy 脚本需要从外部 groovy 脚本解析一个类。我不确定如何传递参数。这是有效的: 我正在运行的 Groovy 脚本使用这一行从 external.groovy 解析外部类: n
现在,当我尝试在 Groovy 中评估一段代码时,我必须做这样的事情: new GroovyShell(new Binding([var1:var1])).evaluate(line) 当您定义了很多
我正在尝试将 groovy 嵌入到大型 Java 应用程序中。 Java 应用程序应该在启动时加载一些实用的 Groovy 脚本。 然后应用程序应该多次运行其他脚本。还需要在 GUI 中输入一些代码并
例如,如果我执行一个 Groovy 脚本,它修改 String 元类,添加一个方法 foo() GroovyShell shell1 = new GroovyShell(); shell1.evalu
考虑这段代码 def RespJson = RespSlurper.parseText(content) def RespNode= "RespJson"+"."+ assertionKey
我正在尝试在我的 java 应用程序中使用 GroovyShell 来运行代码。该代码将用于测试,并在程序完成时导出到 java 文件。为了方便用户,我希望 groovy 的输入与将要执行的 java
我是 Groovy 的新手,所以我希望答案不是很明显... 假设我有一个脚本“Test.groovy”: class A { def greet() {println "Hey there!"
我使用 GroovyShell 类创建了一个 groovy 引擎。然后我用“evaluate”方法运行一堆语句。 有没有办法捕获引擎的输出,以便我可以获得“println”调用输出? 尽管它是一个 s
特别是http://docs.groovy-lang.org/latest/html/api/groovy/util/GroovyScriptEngine.html和 http://docs.groo
我只想在给定的 GroovyShell 上下文中使用自定义 IntegerMetaClass。 原因是为了不让我的潜在“干扰”IntegerMetaClass 污染整个运行时。 当我将我的 Integ
我对 Groovy 很陌生。如何列出我传递给 Binding 构造函数的所有变量? 考虑到我有以下几点: @Test public void test() { List outputNames
我终于让 Gradle 下载依赖项并将它们传递给我从 gralde 任务调用的 groovy 脚本(因为 gradle 似乎不允许我使用葡萄)。 下面的代码是我能够让它工作的唯一方法。这是正确的方法吗
我正在尝试使用 GroovyShell评估 Grails 应用程序中的一些代码片段,但我似乎无法访问我们的 Grails 域类。例如,当我尝试评估这样的事情时: Eval.me("my.package
我编写项目,在其中使用 Groovy 和 Java。我的项目中有这个 Groovy 脚本: int sum(def a, def b) { return (int)a + (int)b; } 在我的
我需要从我的 Java 应用程序运行一些外部代码,这些代码将经常更新并与应用程序的其余部分正交。由于我不会为每次代码更改(以及其他原因)重新部署整个应用程序,我们选择使用 groovy对于此代码,并将
我正在尝试使用 Groovy 为我的应用程序创建交互式脚本/宏模式。该应用程序是 OSGi,脚本可能需要的大部分信息事先并不知道。我想我可以使用 GroovyShell 并多次调用 eval() 以在
我正在使用 eclipse 和 groovy 插件。我正在构建一个测试工具来调试和测试 groovy 脚本。这些脚本非常简单但很长,其中大多数只是 if/else/return。我发现我可以使用 Gr
我想添加 groovy-shell-server到我们的应用程序。我们最近遇到了几个生产问题,调用内部 API 可以加快诊断速度,甚至可以提供短期修复。 Groovy-shell-server 提供了
对于监控系统,我需要评估由 bool 表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可以更复杂): if (webservice is unavailable) and (there a
我是一名优秀的程序员,十分优秀!