У меня есть очень креативное решение, позволяющее моему неподписанному коду получать доступ через мою подписанную библиотеку. Хотя это плохая практика, я боюсь, что у меня нет другого решения (кроме переписывания большого количества кода, который затем необходимо переписать обратно).
У меня есть следующий класс:
public abstract class full {
public static <T,S,P> S access(final T object, final String function, final P parameter) {
AccessController.doPrivileged(new PrivilegedAction<S>() {
@Override
public S run() {
try {
if (parameter == null) {
Class[] argTypes = { };
Object passedArgv[] = { };
return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
} else {
Class[] argTypes = { parameter.getClass() };
Object passedArgv[] = { parameter };
return (S)object.getClass().getMethod(function, argTypes).invoke(object, passedArgv);
}
} catch (NoSuchMethodException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (SecurityException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(full.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
});
return null;
}
}
Отлично работает для функций, которые возвращают объекты, но не для примитивов.
Boolean bool = full.access (..);
приведет к нулевому указателю, потому что универсальные методы не могут обрабатывать примитивы.
Есть идеи о том, как выбрать правильный подход?
Для проверки:
public static Boolean test() {
return true;
}
public Main() {
System.out.println(((Boolean)redirect.full.access(this, "test", null)));
}