具有隐藏构造函数的抽象实例 class
Instance of abstract class with hidden constructor
我需要创建一个带有隐藏构造函数的抽象 class 的实例,class 如下所示:
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建具体的 class 不起作用,因为构造函数不可见,并且通过反射调用构造函数 API 也不起作用,因为 class 是抽象的。
我需要创建一个 android.print.PrintDocumentAdapter.LayoutResultCallback
的实例
本教程似乎解决了如何执行您的要求:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/。我自己从来没有这样做过,所以我不能保证。
注意: API 中的方法被隐藏是有原因的。对于开发人员来说最重要的是,不能保证该方法会持续存在任何时间长度,因为所讨论的方法不属于任何 public API.
我 运行 遇到了完全相同的问题(即使是完全相同的 class),我有一个比按照建议将 android.jar 替换为 framework.jar 更好的解决方案在另一个答案中。
解决方案使用dexmaker library。 (您将需要 dexmaker.1.4.jar 和 dexmaker-dx.1.4.jar)。这是一个在运行时为 Dalvik VM(android 中使用的 VM)生成字节码的库。
这个库有一个名为 ProxyBuilder
的 class,它为摘要 class 生成一个 代理。代理是一个对象,它 扩展抽象 class 并通过将方法分派给您指定的 java.lang.reflect.InvocationHandler
实例来实现方法。
ProxyBuilder
和java.lang.refect.Proxy
几乎一样,只是java.lang.refect.Proxy
只对接口起作用,而dexmaker的ProxyBuilder
对抽象classes起作用,是我们解决问题所需要的。
代码全部为:
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 可以存放一些文件的目录。
我需要创建一个带有隐藏构造函数的抽象 class 的实例,class 如下所示:
public abstract class TestClass {
/**
* @hide
*/
public TestClass() {
}
}
创建具体的 class 不起作用,因为构造函数不可见,并且通过反射调用构造函数 API 也不起作用,因为 class 是抽象的。
我需要创建一个 android.print.PrintDocumentAdapter.LayoutResultCallback
的实例本教程似乎解决了如何执行您的要求:https://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/。我自己从来没有这样做过,所以我不能保证。
注意: API 中的方法被隐藏是有原因的。对于开发人员来说最重要的是,不能保证该方法会持续存在任何时间长度,因为所讨论的方法不属于任何 public API.
我 运行 遇到了完全相同的问题(即使是完全相同的 class),我有一个比按照建议将 android.jar 替换为 framework.jar 更好的解决方案在另一个答案中。
解决方案使用dexmaker library。 (您将需要 dexmaker.1.4.jar 和 dexmaker-dx.1.4.jar)。这是一个在运行时为 Dalvik VM(android 中使用的 VM)生成字节码的库。
这个库有一个名为 ProxyBuilder
的 class,它为摘要 class 生成一个 代理。代理是一个对象,它 扩展抽象 class 并通过将方法分派给您指定的 java.lang.reflect.InvocationHandler
实例来实现方法。
ProxyBuilder
和java.lang.refect.Proxy
几乎一样,只是java.lang.refect.Proxy
只对接口起作用,而dexmaker的ProxyBuilder
对抽象classes起作用,是我们解决问题所需要的。
代码全部为:
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 可以存放一些文件的目录。