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

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; 
     }

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

你可能感兴趣的:(android)