• Android 动态类加载


    Android程序可以通过动态类加载方法,在运行时动态生成对象,调用方法。

    在Android中可以动态加载,但无法像Java中那样方便动态加载jar. 

    原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。

    1. 首先生成被调用的dex文件:

    package com.dynamic;

    public interface IDynamic {
      public String helloworld();
    }

    package com.dynamic;

    public class IDynamicTest implements IDynamic{
      public String helloworld()
      {
        return "hello world";
      }
    }

    构造helloworld函数,将代码Export打包成1.jar文件,调用Android自带的dx工具,将1.jar文件编译成包含dex文件的test.jar。

    2. 在Android代码中,调用test.jar中的helloworld函数。

    public void onClick(View v) {

      button1.setText("LauClass(M1)");

      final File dexpathFile = new File("/data/app/test.jar");                                  // 指定jar文件位置

      DexClassLoader classLoader = new DexClassLoader(dexpathFile.getAbsolutePath(), "/data/app/", null, getClassLoader());   //生成classLoader

      try{

        Class libProvideClass = classLoader.loadClass("com.dynamic.IDynamicTest");                     //利用ClassLoader将类加载进来

        if (libProvideClass==null)

        {

          return ;

        }

        Object obj=libProvideClass.newInstance();                                     //利用得到的类生成实例对象

        Method methodInstance = libProvideClass.getMethod("helloworld", null);                        //获取对象的方法对象

        if(methodInstance==null)

        {

          finish();

        }

        Toast.makeText(secondClass.this, (String)methodInstance.invoke(obj,null), Toast.LENGTH_SHORT).show();        //触发helloworld方法

      } catch(Exception exception)

      {

        exception.printStackTrace();

      }

    }

    Related URL:

    http://my.oschina.net/Jerryking/blog/111575

    http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

  • 相关阅读:
    使用django开发一个web项目初试
    关于github一些比较重要的命令
    删除github repository的方法
    Node、npm与Vue配置与问题记录
    [记忆]5月第二周
    git am patch冲突解决步骤
    git丢弃本地修改的几种方式
    Log4j 2.X 漏洞解决
    Maven依赖范围Scope及传递性依赖
    Mysql创建事件定时任务
  • 原文地址:https://www.cnblogs.com/yulele/p/4355037.html
Copyright © 2020-2023  润新知