Android获取apk签名信息(举例说明java反射调用方法步骤)

来源:互联网 发布:淘宝诈骗村 编辑:程序博客网 时间:2024/05/14 00:32

getMethod() 只能获取public类型的方法,包括类自身、所继承的基类、所实现的接口中的所有public方法;

getDeclaredMethod()只能获取类自身的所有方法,包括public、protected、private,不能获取所继承的基类及实现的接口中的方法。

以下以获取apk签名信息为例,举例反射调用方法的流程:
附上android源码查看链接,对比源码了解如何使用反射调用
http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/

private String getApkSignInfo(String apkPath) {          String PATH_PackageParser = "android.content.pm.PackageParser";          try {          //1、拿到class             Class pkgParserCls = Class.forName(PATH_PackageParser);              Class[] typeArgs = new Class[1];              typeArgs[0] = String.class;           //2、构建该class实例   (api>19时,使用无参构造方式)             Constructor pkgParserCt = pkgParserCls.getConstructor(typeArgs);              Object[] valueArgs = new Object[1];              valueArgs[0] = apkPath;              Object pkgParser = pkgParserCt.newInstance(valueArgs);         //3、构建要调用该方法所需传入的参数的类型        //  public Package More ...parsePackage(File sourceFile, String destCodePath,DisplayMetrics metrics, int flags)             DisplayMetrics metrics = new DisplayMetrics();              metrics.setToDefaults();              typeArgs = new Class[4];              typeArgs[0] = File.class;              typeArgs[1] = String.class;              typeArgs[2] = DisplayMetrics.class;              typeArgs[3] = Integer.TYPE;         //4、使用getDeclaredMethod()获取要调用的方法             Method pkgParser_parsePackageMtd = pkgParserCls.getDeclaredMethod("parsePackage",                      typeArgs);         //5、构造要调用该方法所需传入的参数值             valueArgs = new Object[4];              valueArgs[0] = new File(apkPath);              valueArgs[1] = apkPath;              valueArgs[2] = metrics;              valueArgs[3] = PackageManager.GET_SIGNATURES;         //6、调用invoke,执行该方法,返回Package pkgParserPkg              Object pkgParserPkg = pkgParser_parsePackageMtd.invoke(pkgParser, valueArgs);         //7、以下继续使用反射 调用PackageParser下的collectCertificates方法             typeArgs = new Class[2];              typeArgs[0] = pkgParserPkg.getClass();              typeArgs[1] = Integer.TYPE;              Method pkgParser_collectCertificatesMtd = pkgParserCls.getDeclaredMethod("collectCertificates",                      typeArgs);              valueArgs = new Object[2];              valueArgs[0] = pkgParserPkg;              valueArgs[1] = PackageManager.GET_SIGNATURES;              pkgParser_collectCertificatesMtd.invoke(pkgParser, valueArgs);              Field packageInfoFld = pkgParserPkg.getClass().getDeclaredField("mSignatures");              Signature[] info = (Signature[]) packageInfoFld.get(pkgParserPkg);              return info[0].toCharsString();          } catch (Exception e) {              e.printStackTrace();          }          return null;      }

写上注释只为自己更好理解,若有措词不准之处,望指出.

0 0