我需要使用隐藏的构造函数创建一个抽象类的实例,该类如下所示:
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建一个具体的类是行不通的,因为构造函数是不可见的,并且通过反射API调用构造函数也不起作用,因为该类是抽象的。
我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback的实例
我遇到了完全相同的问题(甚至对于完全相同的类),并且我有一个更好的解决方案,而不是像其他答案中建议的那样用framework.jar替换android.jar。
该解决方案使用dexmaker库。(您将需要dexmaker.1.4.jar和dexmaker-dx.1.4.jar)。这是一个库,可在运行时为Dalvik VM(Android中使用的VM)生成字节码。
该库有一个名为的类ProxyBuilder
,可为抽象类生成代理。代理是扩展抽象类并通过将方法分派到java.lang.reflect.InvocationHandler
您指定的实例来实现方法的对象。
ProxyBuilder
与几乎相同java.lang.refect.Proxy
,除了java.lang.refect.Proxy
仅适用于接口,而dexmaker的ProxyBuilder
适用于抽象类,这就是我们需要解决的问题。
该代码是所有的:
public static PrintDocumentAdapter.LayoutResultCallback getLayoutResultCallback(InvocationHandler invocationHandler,
File dexCacheDir) throws IOException{
return ProxyBuilder.forClass(PrintDocumentAdapter.LayoutResultCallback.class)
.dexCache(dexCacheDir)
.handler(invocationHandler)
.build();
}
回调逻辑在invocationHandler
您提供的中实现。这cacheDir
是dexmaker可以存储一些文件的目录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句