在Groovy脚本中是否可以执行条件导入语句?
if (test){
import this.package.class
} else {
import that.package.class
}
这背景是想在MacOS 10.5上使用只有JDK1.5的东西,所以一个特定的类不可用,但我找到了为它写了一个后端的人。
答案 0 :(得分:3)
没有办法有条件地导入一个类,但你可以通过尝试加载类然后加载另一个类(如果找不到那个类)来实现类似的东西。
这只是一个例子:
def someClass
try {
someClass = "org.apache.webdavlib.WebdavFile" as Class
} catch (Exception ex) {
someClass = "java.io.File" as Class
}
def someInstance = someClass.newInstance("~/project/temp.log")
assert "java.io.File" == someInstance.getClass().getName()
答案 1 :(得分:2)
Jochen“blackdrag”Theodorou刚才在groovy用户名单上提出了以下内容:
wsh = this.class.classLoader.loadClass("org.codehaus.groovy.scriptom.ActiveXObject").newInstance("WScript.Shell")
然后您不需要使用import语句。
以下是邮件列表中的thread
答案 2 :(得分:1)
不,不支持条件导入...我能想到的最好是在java中使用反射...
这里也可以使用ast变换来标记类并使用所需的反射代码包装使用缺少的类的代码
答案 3 :(得分:0)
我想类加载器可以做到这一点,但会很复杂。
您是否考虑使用影子类并且jsut部署不同的jar?
像
这样的东西//jdk 1.5
somethingelse extends this {
}
//jdk 1.6
somtheingelse extends that {
}
=>将两者编译为两个不同的jar文件,这些文件部署在一个系统上而不是另一个系统上......
不完美,但可以工作
... wait:如果您的库只是包名不同,那么您不需要影子类。你不能在同一个包裹中移动这个或那个吗?