标签:java android reflection abstract-class
我需要使用隐藏的构造函数创建一个抽象类的实例,该类如下所示:
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建具体类不起作用,因为构造函数不可见,并且通过反射API调用构造函数也不起作用,因为类是抽象的.
我需要创建一个android.print.PrintDocumentAdapter.LayoutResultCallback实例
解决方法:
我遇到了完全相同的问题(甚至是同一个类),我有一个更好的解决方案,而不是像其他答案中建议的那样用framework.jar替换android.jar.
该解决方案使用dexmaker library.(您将需要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可以存储某些文件的目录.
标签:java,android,reflection,abstract-class 来源: https://codeday.me/bug/20190623/1274949.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。