4

Java Reflectionを使用すると、すべてのメソッドとその戻り値のタイプを検出できます。しかし、メソッドがとして宣言されているかどうかを検出する方法はnativeありますか?

4

5 に答える 5

11

はい、できます。メソッドgetModifiers()は、適切なマスクを適用したintを返し、メソッドがネイティブかどうかを判断できます。

便宜上、このようにすることをお勧めします。

   int modifiers = myMethod.getModifiers(); 
   boolean isNative = Modifier.isNative(modifiers);

Modifierクラスは、メソッドの修飾子を検出するために適切なマスクを適用することを目的としたユーティリティ専用クラスです。

于 2012-08-08T17:10:58.363 に答える
5

メソッドにはgetModifiers()、修飾子をintとして返すメソッドがあり、修飾子の1つは、ですModifier.NATIVE。これは、探しているものです。Modifier.isNative()からの引数をデコードするために使用できますgetModifiers()

(基本的に、メソッドをという名前のメソッドオブジェクトとして持っている場合はm、それModifier.isNative(m.getModifiers())を実行する必要があります。)

于 2012-08-08T17:11:43.977 に答える
5

メソッドに関連付けられている修飾子を確認できます。以下の例は、Objectのすべてのネイティブメソッドを出力します。

for (Method m : methods) {
    int mod = m.getModifiers();
    if ((mod & Modifier.NATIVE) != 0) {
        System.out.println(m.getName());
    }
}

編集

この他の答えは、ビット単位の一致部分を回避するより良いアプローチを提供します。

于 2012-08-08T17:09:57.063 に答える
3

を使用するgetModifiers()と、次のユーティリティ関数を使用してフラグを読み取ることができますModifier

Methods meth = Object.class.getDeclaredMethods()[0];
int mod = meth.getModifiers();
boolean native = Modifier.isNative(mod);
于 2012-08-08T17:13:46.970 に答える
3

はい、できます。メソッドの修飾子を確認してください。

public class NativeMethodModifierTest
{
    public class NativeMethodTest
    {
        public native void method();
    }

    @Test
    public void testNativeMember()
    {
        Method m = NativeMethodTest.class.getMethods()[0];
        Assert.assertEquals(Modifier.NATIVE, (m.getModifiers() & Modifier.NATIVE));
    }
}
于 2012-08-08T17:13:10.413 に答える