浏览代码

Add getMethodHandle to SecurityActions.

The main advantage is that we can do the privileged setAccessible during creation and
then freely invoke via the authorized method handle.

As per the javadocs:
Access checks are applied in the factory methods of Lookup, when a method handle is created.
his is a key difference from the Core Reflection API, since java.lang.reflect.Method.invoke
performs access checking against every caller, on every call.

The performance boost is just a bonus.
tags/rel_3_23_0_ga
nickl- 6 年前
父节点
当前提交
31b7faa0bc
共有 1 个文件被更改,包括 28 次插入2 次删除
  1. 28
    2
      src/main/javassist/util/proxy/SecurityActions.java

+ 28
- 2
src/main/javassist/util/proxy/SecurityActions.java 查看文件

@@ -15,6 +15,8 @@
*/
package javassist.util.proxy;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@@ -51,8 +53,32 @@ class SecurityActions {
}
}

static Method getDeclaredMethod(final Class clazz, final String name,
final Class[] types) throws NoSuchMethodException {
static MethodHandle getMethodHandle(final Class<?> clazz, final
String name, final Class<?>[] params) throws NoSuchMethodException
{
try {
return AccessController.doPrivileged(
new PrivilegedExceptionAction<MethodHandle>() {
public MethodHandle run() throws IllegalAccessException,
NoSuchMethodException, SecurityException {
Method rmet = clazz.getDeclaredMethod(name, params);
rmet.setAccessible(true);
MethodHandle meth = MethodHandles.lookup().unreflect(rmet);
rmet.setAccessible(false);
return meth;
}
});
}
catch (PrivilegedActionException e) {
if (e.getCause() instanceof NoSuchMethodException)
throw (NoSuchMethodException) e.getCause();
throw new RuntimeException(e.getCause());
}
}

static Method getDeclaredMethod(final Class<?> clazz, final String name,
final Class<?>[] types) throws NoSuchMethodException
{
if (System.getSecurityManager() == null)
return clazz.getDeclaredMethod(name, types);
else {

正在加载...
取消
保存