Проблема не в том, что вам нужно хранить классы в java.lang.reflect
, а в том, что где-то в вашем коде отражение используется для загрузки, доступа и, возможно, изменения классов во время выполнения.
Поскольку ProGuard и другие обфускаторы переименовывают ваши классы, чтобы усложнить реверс-инжиниринг, иметь жестко закодированное имя класса в строке может не получиться. Например, рассмотрим этот код:
com.acme.Acme acme = Class.forName("com.acme.Acme").newInstance();
Теперь учтите, что после запуска Proguard на com.acme.Acme
его можно было переименовать в a.a.A
. Код будет эффективно читать:
a.a.A acme = Class.forName("com.acme.Acme").newInstance();
Это приведет к ClassNotFoundException
во время выполнения, поэтому ProGuard выдаст предупреждение или ошибку в зависимости от его конфигурации.
Решение состоит в том, чтобы тщательно выяснить, можете ли вы использовать отражение в своем собственном коде и где вы можете использовать его, можете ли вы избежать такого отражения, можно ли его игнорировать или нужно ли сохранять классы, которые отражаются при .
В моем примере выше вы можете избежать проблем, указав -keepnames com.acme.Acme
. Если для обучения членов класса используется отражение, вам может понадобиться рассмотреть -keep
весь класс и всех его членов.
Но, по сути, по определению запутывание и отражение не очень хорошо сочетаются.