4

使用 Java 反射,您可以检测所有方法及其返回类型。但是有没有办法检测一个方法是否被声明为native

4

5 回答 5

11

是的,您可以。该方法getModifiers()返回一个应用了正确掩码的 int 可以告诉您该方法是否是本机的

为了方便起见,我建议这样做:

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

Modifier 类是一个实用程序专用类,旨在应用适当的掩码以发现方法的修饰符。

于 2012-08-08T17:10:58.363 回答
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 回答
5

Method 有一个getModifiers()将修饰符返回为 int 的方法,其中一个修饰符是Modifier.NATIVE,这是您要查找的。Modifier.isNative()可用于从 解码参数getModifiers()

(基本上,如果您将方法作为 Method 对象命名m,那么Modifier.isNative(m.getModifiers())应该这样做。)

于 2012-08-08T17:11:43.977 回答
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 回答