Android SDK中的一些类或方法由于某些原因而被隐藏,导致开发者不能正常的访问这些类和方法,如果访问,导致编译出错。由于SDK中隐藏,而手机环境中的确存在,所以只要我们通过编译,那么在手机上是可以运行的。
看了网上的一些资料,主要的处理方法有两种:
- 在项目中使用重新编译后的,暴露隐藏类和方法的SDK;
- 在项目中利用Java的反射机制来访问隐藏的类和方法;
- 把项目用到的相关类从源码中复制到项目中或者单独导入到一个项目中『后者需要建立目标项目和依赖类所在项目的依赖关系』,保持类所在路径和源码一致,找出并处理掉类中的错误;
说明:
- 方法1:前期准备较多,但后期开发较容易;
- 方法2:需要对Android源码有所了解才能正确编码;
- 方法3:需要的类和一些其它类必然有依赖关系,而真实开发中不需要源码中所有的类,故需要找到并处理掉相关类中的错误;
本文主要想说一下反射操作,并示例中不涉及到Android SDK中相关的隐藏类!
Java反射机制:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。『百度百科』
和Java反射有关的类有:
- Class;
- Field;
- Method;
- Constructor;
- Array;
获取Class对象的方法有:
- getClass;
- getSuperClass;
- Class.forName;
- 类型.class;
- 基本类型包装类.TYPE;
Class<?> classObject; // getClass(); String string = new String(); classObject = string.getClass(); // getSuperClass(); Object object = new Object(); classObject = object.getClass().getSuperclass(); // Class.forName(); try { classObject = Class.forName("package-name" + "class-name"); } catch (ClassNotFoundException e) { e.printStackTrace(); } // 类名.class classObject = String.class; classObject = Integer.class; classObject = int.class; // 基本类型封装类.TYPE classObject = Integer.TYPE; classObject = Boolean.TYPE;
对于类中方法和属性的访问,参考下面代码:
package reflect; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; interface Animal { } class Person implements Animal { public String publicString = "this is a public string!"; private String name; private int age; public Person() { System.out.println("Person()" + this.hashCode()); name = ""; age = -1; } public Person(String name, int age) { this.name = name; this.age = age; } public Person(String name) { this(); this.name = name; } public Person(int age) { this(); this.age = age; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void say(String message) { System.out.println(message); } private void sing(String message) { System.out.println(message); } @Override public String toString() { return "{Name:" + name + " Age:" + age + "}"; } } public class TestReflect { public static void main(String[] args) { try { Class<?> classPerson = Class.forName("reflect.Person"); Person person = (Person) classPerson.newInstance(); System.out.println("Person:" + person); person.setName("Tom"); person.setAge(18); System.out.println("Person:" + person); Constructor<?>[] constructors = classPerson.getConstructors(); for (int i = 0, length = constructors.length; i < length; i++) { System.out.println("构造函数:" + constructors[i]); Class<?>[] parameterTypes = constructors[i].getParameterTypes(); for (int j = 0, lengthPatamter = parameterTypes.length; j < lengthPatamter; j++) { System.out.println("参数类型:" + parameterTypes[j].getName()); } } Class<?>[] interfaces = classPerson.getInterfaces(); for (int i = 0, length = interfaces.length; i < length; i++) { System.out.println("实现接口:" + interfaces[i].getName()); } Class<?> superClass = classPerson.getSuperclass(); System.out.println("父类:" + superClass); Method[] methods = classPerson.getMethods(); for (int i = 0, length = methods.length; i < length; i++) { Class<?> returnType = methods[i].getReturnType(); System.out.println("方法名称:" + methods[i]); System.out.println("返回类型:" + returnType); } Field[] fields = classPerson.getDeclaredFields(); for (int i = 0, length = fields.length; i < length; i++) { System.out.println("属性:" + fields[i].getName() + " 类型:" + fields[i].getType()); } Method methodToString = classPerson.getMethod("toString"); System.out.println("toString:" + methodToString.invoke(classPerson.newInstance())); Method methodSay = classPerson.getDeclaredMethod("say", String.class); methodSay.invoke(classPerson.newInstance(), "This is a message to say!:)"); Method methodSing = classPerson.getDeclaredMethod("sing", String.class); methodSing.setAccessible(true); Object object = classPerson.newInstance(); methodSing.invoke(object, "This is a song to sing!:)"); Field publicStringField = classPerson.getField("publicString"); System.out.println(publicStringField.get(object).toString()); publicStringField.set(object, ":)"); System.out.println(publicStringField.get(object).toString()); Field nameField = classPerson.getDeclaredField("name");青蛙咬到手 nameField.setAccessible(true); System.out.println(nameField.get(object).toString()); nameField.set(object, ":)"); System.out.println(nameField.get(object).toString()); } catch (Exception e) { e.printStackTrace(); } } }
说明:为了可以访问私有的方法或属性,需要调用setAccessible方法!
多说一句:在程序员的世界里,问题总有解决的办法!如果暂时没有找到,要么是没有理解问题产生的原因,要么是自己知识欠缺!
相关推荐
Android隐藏的API Android隐藏API是Google由于稳定性原因向您隐藏的类,方法和资源。 这些功能被隐藏,因为它们可能会在下一个API版本中更改。 内部API位于包com.android.internal ,可在framework.jar ,而隐藏的...
Android Hidden API Android Hidden API is a modified jar file which combines the android.jar from the Android SDK with the framework.jar from a real device. This jar enables to use Android's internal/...
最新android4.2 sdk jar包,包含android最新版本的所有隐藏类。 在引入时可添加包,或直接替换开发包中的android.jar
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
8.16 访问网站login api 573 8.17 地震速报 578 8.18 通过web api动态更改手机spinner控件 587 8.19 网络语音搜索 590 8.20 网络下载过程中显示加载中 593 8.21 快照webview加载的网页画面 596 ...
8.16 访问网站Login API 8.17 地震速报 8.18 通过Web API动态更改手机Spinner控件 8.19 网络语音搜索 8.20 网络下载过程中显示加载中 8.21 快照WebView加载的网页画面 8.22 网页的放大与缩小 8.23 WebView网页载入中...
8.16 访问网站Login API 8.17 地震速报 8.18 通过Web API动态更改手机Spinner控件 8.19 网络语音搜索 8.20 网络下载过程中显示加载中 8.21 快照WebView加载的网页画面 8.22 网页的放大与缩小 8.23 WebView网页载入中...
8.16 访问网站Login API 8.17 地震速报 8.18 通过Web API动态更改手机Spinner控件 8.19 网络语音搜索 8.20 网络下载过程中显示加载中 8.21 快照WebView加载的网页画面 8.22 网页的放大与缩小 8.23 WebView网页载入中...
8.16 访问网站Login API 8.17 地震速报 8.18 通过Web API动态更改手机Spinner控件 8.19 网络语音搜索 8.20 网络下载过程中显示加载中 8.21 快照WebView加载的网页画面 8.22 网页的放大与缩小 8.23 WebView网页载入中...
的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...
应用程序框架开发人员也可以完全访问核心应用程序所使用的API 框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循...
8.16 访问网站Login API 8.17 地震速报 8.18 通过Web API动态更改手机Spinner控件 8.19 网络语音搜索 8.20 网络下载过程中显示加载中 8.21 快照WebView加载的网页画面 8.22 ...
综上所述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...
Android 键盘/Android 系统/API Domes/Certificate Installer(证书安装)/com.android.gestuer.builder()/com.android.sdksetup()/Custom Locale()/Dev Tools(开发工具)/Example Wallpapers(墙纸式样)/HTML查看器/...
5. 可对短网址设置访问限制,例如仅限微信内访问,仅限Android手机访问等 淘宝客 1. 创建、编辑、删除、分享中间页 2. 查看中间页访问量、淘口令复制次数 3. 可设置入口域名、落地域名、短链域名、生成短链接 4. ...
5. 可对短网址设置访问限制,例如仅限微信内访问,仅限Android手机访问等 淘宝客 1. 创建、编辑、删除、分享中间页 2. 查看中间页访问量、淘口令复制次数 3. 可设置入口域名、落地域名、短链域名、生成短链接 4. ...
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性)。...
零反射无Hack实现插件技术:从理论上就已经确定无需对任何系统做兼容开发,更无任何隐藏API调用,和Google限制非公开SDK接口访问的策略完全不冲突。 全动态插件框架:一次性实现完美的插件框架很难,但阴影将这些...