使用Java Reflection,您可以检测方法是否为Native?

时间:2012-08-08 17:05:27

标签: java reflection native

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

5 个答案:

答案 0 :(得分:11)

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

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

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

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

答案 1 :(得分:5)

您可以检查与该方法关联的修改器。下面的示例打印Object的所有本机方法:

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

修改

This other answer提供了一种避免按位匹配部分的更好方法。

答案 2 :(得分:5)

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

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

答案 3 :(得分: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));
    }
}

答案 4 :(得分:3)

使用getModifiers(),您可以使用Modifier中的实用程序功能读取标记:

Methods meth = Object.class.getDeclaredMethods()[0];
int mod = meth.getModifiers();
boolean native = Modifier.isNative(mod);