1. 首页 > 科技

tasker-Java函数-利用反射获取隐藏API?

tasker-Java函数-利用反射获取隐藏API?

Android应用开发中如何使用隐藏API

》。利用反射机制使用隐藏API的方法的优点是灵活,能够在不兼容的系统捕获异常,而使程序不至于崩溃;缺点是过程太繁杂,而且对于隐藏类的继承等很难实现。如果需要大量使用隐藏API

,使用反射无疑会让程序员很烦的。

在JAVA中,怎么利用反射获取一个方法

import java.lang.reflect.*;

public class TestClass{

public static void main(String[] args) throws Exception{

/*Class c=Class.forName("Student");

Field[] fs=c.getDeclaredFields();

System.out.println("class "+c.getSimpleName()+"{");

for(Field f:fs){

System.out.println(f.getType().getSimpleName()+" "+f.getName()+";");

}

Method[] ms=c.getDeclaredMethods();

for(Method m:ms){

System.out.print(m.getReturnType().getSimpleName()+" ");

System.out.print(m.getName()+"(");

Class[] ps=m.getParameterTypes();

for(Class p:ps){

System.out.print(p.getSimpleName()+",");

}

System.out.println("){}");

}

Constructor[] cons=c.getConstructors();

for(Constructor con:cons){

System.out.println(c.getSimpleName()+"(");

Class[] ps=con.getParameterTypes();

for(Class p:ps){

System.out.print(p.getSimpleName()+",");

}

System.out.println("){}");}*/

Object s=new Student("chun ",18);

Class c=s.getClass();

Field[] fs=c.getDeclaredFields();

for(Field f:fs){

f.setAccessible(true);

System.out.println(f.getName()+"="+f.get(s));

// f.set(s,"123");

// System.out.println(f.getName()+"="+f.get(s));

}

Class[] ps={};//无参数

Method m=c.getDeclaredMethod("study",ps);

Object[] os={};

m.invoke(s);

/* Class[] ps={String.class,int.class};//有参数

Method m=c.getDeclaredMethod("study",ps);//说明是哪个方法

Object[] os={"CoreJava",new Integer(3)};//简单类型变成包装类;

m.invoke(s,os);*/

}

}

class Student{

private String name;

private int age;

public Student(){}

public Student(String name,int age){

this.name=name;

this.age=age;

}

public void setName(String name){

this.name=name;

}

public void setAge(int age){

this.age=age;

}

public void study(){

System.out.println("Student "+name+" study1");

}

public String study(String course,int time){

System.out.println("Student "+name+" studies "+course+" for "+time+" times");

if(time>=3)return "good";

else return "bad";

}

}

这是我们当时学反射的时候打的代码 属性 方法 构造方法 都有

android apk使用了隐藏API,如何运行在使用其他ROM的手机上

1、即使使用了隐藏的api,便一定成功后,也是可以运行的。但是要保证这个rom内含有这个隐藏的api;

2、对于隐藏的api,建议的方法是,通过java反射的方法去获取,这样不需要导入自己编译的jar包,同时保证了程序的安全性(因为会有反射失败的异常处理等)。

如何生成内部hide接口实例并通过反射作为参数进行传递

一、前言

在android系统源码中,有很多的api是隐藏的,在eclipse中通过sdk是无法访问到的。这些api有的是整个类/接口、有的是某个具体的方法、或者变量,在源码中通过文档注释内的“@hide”字符进行标识。如果我们需要去访问这些被hide的方法、类,可以采用如下两种方式:

1、在源码环境下进行访问,即将我们的工程放到源码下进行编译,这样是可以访问的;

2、通过java的反射机制

二、场景描述

这里讲述的是在eclipse下直接通过反射机制来访问系统隐藏api。举例如下:

android.app.ActivityManagerNative类定义了一个setActivityController(IActivityController watcher)方法,该方法通过参数IAcitivityController设置一个监听器,用来监听系统启动某个Activity。当系统启动某个Activity时,会调用IAcitivityController的回调方法。

在工程中可以通过获取ActivityManagerNative对象并生成一个IActivityController实例作为setActivityController()的参数传递过去,从而达到在工程中监听到系统Activity的启动。

ActivityManagerNative.java和IAcitivityController.aidl均为hide api,如下:

[java] view plaincopy

package android.app;

/** {@hide} */

public abstract class ActivityManagerNative extends Binder implements IActivityManager{

/**

* Retrieve the system's default/global activity manager.

*/

static public IActivityManager getDefault() {

return gDefault.get();

  }

  public void setActivityController(IActivityController watcher) throws RemoteException{}

}

package android.app;

import android.content.Intent;

/**

* Testing interface to monitor what is happening in the activity manager

* while tests are running. Not for normal application development.

* {@hide}

*/

interface IActivityController

以上类都有“@hide”标识,所以需要通过反射的机制来进行访问。ActivityManagerNative对象可通过反射和该类的静态方法getDefault()获取到,再通过setActivityController方法设置监听器。但IActivityController也是内部hide aidl文件,如何继承该接口并实例化呢?

解决方案:把系统内的IActivityController.aidl文件在我们自己的工程里按照同样的包结构创建一份,在程序中继承该接口,在调用setActivityController时传入该实例即可。

三、实现过程

1、拷贝系统内IActivityController.aidl到工程中,与系统内该文件包结构保持一致:

2、程序中实现该接口:

[java] view plaincopy

private class ActivityController extends IActivityController.Stub {

public boolean activityStarting(Intent intent, String pkg) {

return true;

}

public boolean activityResuming(String pkg) {

return true;

}

public int appEarlyNotResponding(String processName, int pid,

String annotation) {

return 0;

}

public boolean appCrashed(String processName, int pid, String shortMsg,

String longMsg, long timeMillis, String stackTrace) {

return false;

}

public int appNotResponding(String processName, int pid,

String processStats) {

return 0;

}

}

3、通过反射获取ActivityManagerNative对象并调用方法setActivityController进行监听器设置:

[java] view plaincopy

private void setActivityController() {

try {

Class cActivityManagerNative = Class

.forName("android.app.ActivityManagerNative");

Method mGetDefault = cActivityManagerNative.getMethod("getDefault",

null);

Object oActivityManagerNative = mGetDefault.invoke(null, null);

Class i = Class.forName("android.app.IActivityController$Stub");

Method mSetActivityController = cActivityManagerNative.getMethod(

"setActivityController",

Class.forName("android.app.IActivityController"));

mSetActivityController.invoke(oActivityManagerNative,

new ActivityController());

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}