「抽象クラスのインスタンス化」とあなたは言います。"不可能!"
これが私のコードです:
public static AbstractFoo getAbstractFoo(Context context) {
try {
Class<?> klass = Class
.forName("com.bat.baz.FooBar");
Constructor<?> constructor = klass.getDeclaredConstructor(
String.class, String.class);
constructor.setAccessible(true);
AbstractFoo foo = (AbstractFoo) constructor.newInstance(
"1", "2");
return foo;
} catch (ClassNotFoundException e) {
// Ignore
} catch (NoSuchMethodException e) {
throw new InflateException(
"No matching constructor");
} catch (IllegalAccessException e) {
throw new InflateException("Could not create foo", e);
} catch (InvocationTargetException e) {
throw new InflateException("Could not create foo", e);
} catch (InstantiationException e) {
throw new InflateException("Could not create foo", e);
}
return null;
}
com.bat.baz.FooBar は、AbstractFoo を拡張するプライベート クラスです。Proguard がなければ、このコードは私の Android デバイスで実行されます。これにより、NoSuchMethodException の try/catch で失敗します。
Proguard構成ファイルに次のようなステートメントを追加し続けます
-keep public abstract class AbstractFoo
{public *;protected *; private *;}
しかし、それでは問題は解決しません。これがAbstractFooオブジェクトをインスタンス化する有効な方法であることをProguardに受け入れさせるにはどうすればよいですか? 少なくとも、Proguard なしで動作する場合は、Proguard で動作するはずです。