final 方法 反射
时间: 2023-10-29 15:05:42 浏览: 42
在 中,final 方法是不能被子类重写的方法。因此,如果你想使用反射来调用一个 final 方法,你需要使用其他方法。一种方法是使用 Method.setAccessible(true) 来设置访问权限,但是这种方法可能会引起安全问题。另一种方法是使用 MethodHandles.lookup() 来获取一个 MethodHandle,然后使用 MethodHandle.invoke() 来调用该方法。以下是一个示例代码:
```java
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
public class FinalMethodReflection {
public static void main(String[] args) throws Throwable {
MyClass obj = new MyClass();
Method method = MyClass.class.getDeclaredMethod("hello");
MethodHandle methodHandle = MethodHandles.lookup().unreflect(method);
methodHandle.invoke(obj);
}
}
class MyClass {
public final void hello() {
System.out.println("Hello, world!");
}
}
```
在这个例子中,我们使用 MethodHandles.lookup().unreflect() 方法来获取 MethodHandle,然后使用 MethodHandle.invoke() 来调用 hello() 方法。由于 hello() 是一个 final 方法,因此我们不能使用反射 API 直接调用它。