ClassLoader使用经验(一)

  在Android开发中,有时,会需要在应用中额外下载一些其他的插件,进行额外的功能。比如QQ的皮肤,掌阅的语音包,需要在使用过程中下载额外的apk,但是额外的apk无需安装我们即可使用里面的资源和方法。这样的功能就是用ClassLoader实现的。在此记录一些ClassLoader的使用方法与经验用以备忘。

  这里要实现的例子很简单。我在一个额外的工程B中实现一个Toast的方法,然后用工程A中的类去调用这个方法。

  首先来看看工程B:

  工程B中我先实现了一个简单的类

public class ToastClass {

    public void alertMessage(Context context , String str){
        Toast.makeText(context , str , Toast.LENGTH_SHORT ).show();
    }

}

  等会在工程A中传入上下文和要显示的内容即可弹出一个toast窗。

  但是,并不是任何apk中的内我们都能随意调用,我们首先要做一个协定。协定的方式是action,我们在AndroidManifest中的MainActivity的Intent-Filter中加入以下一行

<action android:name="com.dream.fishbonelsy.blurtestdemo"/>

  这样,工程A就以此为凭据调用工程B中的类和方法。

  下面在工程A中,使用ClassLoader来获取这个apk

  

        // 获取APK
        Intent intent = new Intent("com.dream.fishbonelsy.blurtestdemo" , null);
        // 获取包管理器
        PackageManager packageManager = context.getPackageManager();
        List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);
        // 获得指定的activity的信息
        ActivityInfo activityInfo = resolveInfos.get(0).activityInfo;
        // 获得包名
        String packageName = activityInfo.packageName;
        // 获得apk目录
        String apkPath = activityInfo.applicationInfo.sourceDir;
        //dex解压后的目录,注意,这个用宿主程序的目录,android中只允许程序读取写自己
        //目录下的文件
        String dexOutputDir = context.getApplicationInfo().dataDir;
        //native代码的目录
        String libPath = activityInfo.applicationInfo.nativeLibraryDir;
        //创建类加载器,把dex加载到虚拟机中
        DexClassLoader calssLoader = new DexClassLoader(apkPath, dexOutputDir, libPath,
                this.getClass().getClassLoader());

  这里通过包管理器和工程B的action获得一系列需要的信息:apk目录,文件目录,native代码录目,包名。

  获取了包名之后,如果我们知道类名和方法名就可以直接调用了。

  

//利用反射调用插件包内的类的方法

        try {
            Class<?> clazz = calssLoader.loadClass(packageName+".ToastClass");

            Object obj = clazz.newInstance();
            Class[] param = new Class[2];
            param[0] = Context.class;
            param[1] = String.class;
            Method method = clazz.getMethod("alertMessage", param);
            method.invoke(obj,context , "hello android");

            Log.i("Host", "return result is " );

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

  通过反射,我们即可调用工程B中的方法。

Done

时间: 2024-11-06 16:01:11

ClassLoader使用经验(一)的相关文章

java 使用ClassLoader动态加载jar,zip文件

java ClassLoader的使用 public class Main {     public static void main(String[] args) {                  URL[] urls = new URL[] {};         MyClassLoader classLoader = new MyClassLoader(urls, null);         String path = "E:/WorkSpace/MapSDKLibrary/libs

myBatis中的注解@Param、返回值为Map、JAVA读取Excel并解析文本、Class.getResource()和ClassLoader.getResource()

myBatis中的注解@Param:http://blog.csdn.net/gao36951/article/details/44258217:  http://www.cnblogs.com/thomas12112406/p/6217211.html. myBatis返回值为Map:http://blog.csdn.net/werewr342352321df/article/details/11892755. ====================== JAVA读取Excel并解析文本:h

ClassLoader.getSystemResourceAsStream()

一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件config.properties 那么,应该有如下代码: //前面没有"/"代表当前类的目录 InputStream is1 = Test.class.getResourceAsStream("config.properties"); System.out.println(is1);// 不为null   第二:在Test.class目录的子目录下,

classloader

4 Jboss 启动及加载过程 详细参考: http://tech.it168.com/j/2007-06-27/200706271521984.shtml 1) org.jboss.Main.main(String[]) 为入口 . 2) main 函数创建一个名叫” jboss ”的线程组 , 然后创建一个属于该组的线程 , 在线程中执行 boot 方法 . 3) boot 方法首先处理 main 函数中的参数 ( 及一些其它的系统环境设置 ), 接着就用系统的属性创建了org.jboss.

深入浅出ClassLoader

你真的了解ClassLoader吗? 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? ,融入和补充了笔者的一些实践.经验和样例.本文的例子比原文更加具有实际意义,文字内容也更充沛一些,非常感谢作者 Jevgeni Kabanov 能够共享如此优秀的文档. 1. 为什么你需要了解和敬畏ClassLoader ClassLoader在Java语言中占据了核心地位,Java应用服务器,OSGi,以及大量的网络框架,它们大多数都用到了

[Java开发之路](18)关于Class.getResource和ClassLoader.getResource的路径问题

Java中取资源时,经常用到Class.getResource和ClassLoader.getResource.昨天老师讲解题目时候,问我们为什么你们都是在文件前家上"/": String path = Resources.class.getResource("/a.txt").getPath(); 注:在Resources文件下创建了a.txt文件 我想我反正是试出来的,不使用"/"不行.为了正式解答心中的疑惑,我们正式来看看Resources

Java ClassLoader 原理详细分析

一.什么是ClassLoader? 大家都知道,当我们写好一个Java程序之后,不是管是CS还是BS应用,都是由若干个.class文件组织而成的一个完整的Java应用程序,当程序在运行时,即会调用该程序的一个入口函数来调用系统的相关功能,而这些功能都被封装在不同的class文件当中,所以经常要从这个class文件中要调用另外一个class文件中的方法,如果另外一个文件不存在的,则会引发系统异常.而程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的

Java ClassLoader深入讲解(转)

当JVM(Java虚拟机)启动时,会形成由三个类加载器组成的初始类加载器层次结构: bootstrap classloader                |       extension classloader                |       system classloader bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类.在Sun的JVM中,在执行java的命令中使用-Xbootclasspath选项或使用 - D选

数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题

数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题. 用过很多数据恢复软件,最早EasyRecovery pro,恢复过U盘,手机SD卡,硬盘数据.但现在下载不了最新版,而且BAIDU出来的都是国产收费软件假冒的,因为国产恢复软件都太差劲了,所以想偷梁换柱,不仅要收费,而且网上评论恢复效果也很差. 后来用过两款国外crack版的recuva和FinalData,效果也不错,但是有几次帮朋友恢复手机sd卡的时候,照片图片恢复后很多,打不开也不能预览.研究了很长时间,和