Java Reflectionを使用すると、すべてのメソッドとその戻り値のタイプを検出できます。しかし、メソッドがとして宣言されているかどうかを検出する方法はnative
ありますか?
5 に答える
はい、できます。メソッドgetModifiers()
は、適切なマスクを適用したintを返し、メソッドがネイティブかどうかを判断できます。
便宜上、このようにすることをお勧めします。
int modifiers = myMethod.getModifiers();
boolean isNative = Modifier.isNative(modifiers);
Modifierクラスは、メソッドの修飾子を検出するために適切なマスクを適用することを目的としたユーティリティ専用クラスです。
メソッドにはgetModifiers()
、修飾子をintとして返すメソッドがあり、修飾子の1つは、ですModifier.NATIVE
。これは、探しているものです。Modifier.isNative()
からの引数をデコードするために使用できますgetModifiers()
。
(基本的に、メソッドをという名前のメソッドオブジェクトとして持っている場合はm
、それModifier.isNative(m.getModifiers())
を実行する必要があります。)
メソッドに関連付けられている修飾子を確認できます。以下の例は、Objectのすべてのネイティブメソッドを出力します。
for (Method m : methods) {
int mod = m.getModifiers();
if ((mod & Modifier.NATIVE) != 0) {
System.out.println(m.getName());
}
}
編集
この他の答えは、ビット単位の一致部分を回避するより良いアプローチを提供します。
を使用するgetModifiers()
と、次のユーティリティ関数を使用してフラグを読み取ることができますModifier
。
Methods meth = Object.class.getDeclaredMethods()[0];
int mod = meth.getModifiers();
boolean native = Modifier.isNative(mod);
はい、できます。メソッドの修飾子を確認してください。
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));
}
}