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.
54 lines
1.9 KiB
54 lines
1.9 KiB
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; |
|
} |
|
}
|
|
|