条件类导入/加载

时间:2011-08-21 17:07:51

标签: class groovy import

在Groovy脚本中是否可以执行条件导入语句?

if (test){
    import this.package.class
} else {
    import that.package.class
}

这背景是想在MacOS 10.5上使用只有JDK1.5的东西,所以一个特定的类不可用,但我找到了为它写了一个后端的人。

4 个答案:

答案 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:如果您的库只是包名不同,那么您不需要影子类。你不能在同一个包裹中移动这个或那个吗?