9

Scalaで強制する方法をウェブで検索しましたsrictfpが、そのヒントは見つかりませんでした。不満を言う人もいますが、本当の解決策は見つかりません。ほぼ2年前のバグトラッカーエントリがあります。回避策を探している途中で、それに対するエレガントな修正はないようです。

私の現在の考えは、生成されたバイトコードに適切なメソッドフラグACC_STRICTを自分で設定することですが、それを行うための最善の解決策が何であるかわかりません。Scalaコンパイラプラグインが頭に浮かぶか、16進エディタでフラグをハッキングするだけです。たぶん誰かが同じ課題に直面し、彼または彼女の解決策を教えてくれますか?

4

2 に答える 2

6

strictfpビルドプロセスにポストプロセッサを追加して、生成されたクラスに修飾子を追加することができます(つまり、ACC_STRICT言うようにフラグを設定します)。

たとえば、 Javassistを使用してこのようなポストプロセッサを実装できます。これは次のようになります。

CtClass clazz = ClassPool.getDefault().makeClass(
                    new FileInputStream("old/HelloWorld.class"));

CtMethod method = clazz.getDeclaredMethod("testMethod");

method.setModifiers(method.getModifiers() | Modifier.STRICT);

clazz.detach();
clazz.toBytecode(new DataOutputStream(new FileOutputStream(
    "new/HelloWorld.class")));

次に、この方法で変更する必要のあるクラス/メソッドを構成する方法を見つける必要があります。

于 2010-10-27T17:02:55.020 に答える
1

Scalaにstrictfp注釈が付けられました:

@strictfp
def f() = …
于 2015-03-15T23:04:40.283 に答える