我正在使用jodatime Java库并在尝试在coldfusion中使用它时遇到问题。
我已下载最新的jodatime 2.1版本,将jar文件放入我本地驱动器上的文件夹中,并指向我的coldfusion管理员查看下的 ColdFusion类路径中的该文件夹> Java和JVM 设置页面。
大多数情况下都有效。但有时我会得到这样的事情:
local.oTestZone = createObject('java','org.joda.time.DateTimeZone').init('Europe/London');
哪个应与此匹配:Constructor但是我在coldfusion中收到错误说:
无法为类org.joda.time.DateTimeZone找到接受类型(java.lang.String)参数的构造函数。
当我做这样的事情时,它完全正常:
local.oToZone = createObject('java','org.joda.time.DateTimeZone').forID('Europe/London');
哪个匹配:forID
我在java实现中遗漏了什么吗?
答案 0 :(得分:4)
DateTimeZone(String id)
构造函数被标记为protected(我花了3次读取JavaDoc来发现它),因此CF将无法调用它。
在我看来,JodaTime希望您使用其中一种静态方法来构建实例,因此您的第二个示例可能是正确的方法。
答案 1 :(得分:2)
您正在处理抽象类和受保护的构造函数。
受保护的构造函数意味着只有同一个包中的子类或类才能调用该构造函数。因此,即使您提供了正确的参数,构造函数也无法用于您的代码。
ColdFusion documentation有这些花絮:
“尽管cfobject标记加载了类,但它不会创建实例对象。在调用cfobject之后,只能立即访问静态方法和字段。”
这就是forID
有效的原因;这是一种静态方法。
“要对对象进行持久访问,必须使用init函数,因为它返回对对象实例的引用,而cfobject则不会。”
这个以及之前的陈述是getOffset
之类的方法在这种情况下不起作用的原因。
我对此不太熟悉,知道是否有一个可以实例化的类可以让你访问构造函数,但希望其他人可以插入。