0

現在、jodatime Javaライブラリを使用していますが、ColdFusion内で使用しようとすると問題が発生します。

最新のjodatime2.1リリースをダウンロードし、jarファイルをローカルドライブのフォルダーに配置し、ColdFusion管理者にJavaおよびJVM設定ページのColdFusionクラスパスでそのフォルダーを確認するように指示しました。

ほとんどの場合、それは機能します。しかし、私はこのようなものを得ることがあります:

local.oTestZone = createObject('java','org.joda.time.DateTimeZone').init('Europe/London');

これはこれと一致するはずです:コンストラクターしかし、coldfusionで次のようなエラーが発生します:

タイプ(java.lang.String)のパラメーターを受け入れるクラスorg.joda.time.DateTimeZoneのコンストラクターが見つかりません。

しかし、私がこのようなことをすると、それは完全にうまく機能します:

local.oToZone   = createObject('java','org.joda.time.DateTimeZone').forID('Europe/London');

一致するもの:forID

Java実装で何かが足りませんか?

4

2 に答える 2

4

DateTimeZone(String id)コンストラクターは保護されているとマークされているため(JavaDocを3回読み取ってそれを見つけることができます)、CFはコンストラクターを呼び出すことができません。

JodaTimeは、静的メソッドの1つを使用してインスタンスを構築することを期待しているように見えるので、2番目の例はおそらくそれを行う正しい方法です。

于 2012-11-12T11:30:56.830 に答える
2

抽象クラスと保護されたコンストラクターを扱っています。

保護されたコンストラクターとは、同じパッケージ内のサブクラスまたはクラスのみがそのコンストラクターを呼び出すことができることを意味します。したがって、正しいパラメーターを指定していても、コンストラクターはコードで使用できません。

ColdFusionのドキュメントには次のような情報があります。

「cfobjectタグはクラスをロードしますが、インスタンスオブジェクトは作成しません。cfobjectを呼び出した直後にアクセスできるのは静的メソッドとフィールドのみです。」

これが機能する理由forIDです。これは静的なメソッドです。

「オブジェクトに永続的にアクセスするには、init関数を使用する必要があります。これは、オブジェクトのインスタンスへの参照を返しますが、cfobjectは返さないためです。」

これと前のステートメントがgetOffset、このような状況で機能しない理由です。

コンストラクターにアクセスできるようにインスタンス化できるクラスがあるかどうかを知るには、これについて十分な知識がありませんが、他の誰かがチャイムを鳴らすことができれば幸いです。

于 2012-11-12T11:34:15.137 に答える