mirror of https://github.com/alibaba/easyexcel
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.9 KiB
55 lines
1.9 KiB
4 years ago
|
package com.alibaba.excel.util;
|
||
|
|
||
|
import java.lang.reflect.AccessibleObject;
|
||
|
import java.lang.reflect.Member;
|
||
|
import java.lang.reflect.Modifier;
|
||
|
|
||
|
/**
|
||
|
* Member utils.
|
||
|
*
|
||
|
* @author Jiaju Zhuang
|
||
|
*/
|
||
|
public class MemberUtils {
|
||
|
|
||
|
private static final int ACCESS_TEST = Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE;
|
||
|
|
||
|
|
||
|
/**
|
||
|
* XXX Default access superclass workaround.
|
||
|
*
|
||
|
* When a {@code public} class has a default access superclass with {@code public} members,
|
||
|
* these members are accessible. Calling them from compiled code works fine.
|
||
|
* Unfortunately, on some JVMs, using reflection to invoke these members
|
||
|
* seems to (wrongly) prevent access even when the modifier is {@code public}.
|
||
|
* Calling {@code setAccessible(true)} solves the problem but will only work from
|
||
|
* sufficiently privileged code. Better workarounds would be gratefully
|
||
|
* accepted.
|
||
|
* @param o the AccessibleObject to set as accessible
|
||
|
* @return a boolean indicating whether the accessibility of the object was set to true.
|
||
|
*/
|
||
|
static boolean setAccessibleWorkaround(final AccessibleObject o) {
|
||
|
if (o == null || o.isAccessible()) {
|
||
|
return false;
|
||
|
}
|
||
|
final Member m = (Member) o;
|
||
|
if (!o.isAccessible() && Modifier.isPublic(m.getModifiers()) && isPackageAccess(m.getDeclaringClass().getModifiers())) {
|
||
|
try {
|
||
|
o.setAccessible(true);
|
||
|
return true;
|
||
|
} catch (final SecurityException e) { // NOPMD
|
||
|
// ignore in favor of subsequent IllegalAccessException
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns whether a given set of modifiers implies package access.
|
||
|
* @param modifiers to test
|
||
|
* @return {@code true} unless {@code package}/{@code protected}/{@code private} modifier detected
|
||
|
*/
|
||
|
static boolean isPackageAccess(final int modifiers) {
|
||
|
return (modifiers & ACCESS_TEST) == 0;
|
||
|
}
|
||
|
}
|