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

时间: 2024-10-18 11:36:13

Android 动态类加载的相关文章

Android 动态类加载实现免安装更新

随着Html5技术成熟,轻应用越来越受欢迎,特别是其更新成本低的特点.与Native App相比,Web App不依赖于发布下载,也不需要安装使用,兼容多平台.目前也有不少Native App使用原生嵌套WebView的方式开发.但由于Html渲染特性,其执行效率不及Native App好,在硬件条件不佳的机子上流畅度很低,给用户的体验也比较差.反观Native App,尽管其执行效率高,但由于更新频率高而导致频繁下载安装,这一点也令用户很烦恼.本文参考java虚拟机的类加载机制,以及网上And

实现Android 动态加载APK(Fragment or Activity实现)

尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 最近由于项目太大了,导致编译通不过(Android对一个应用中的方法个数貌似有限制),所以一直琢磨着能否将某些模块的APK不用安装,动态加载,通过在网上查找资料和网友的帮助,终于实现了APK的动态加载,网络上介绍APK动态加载的文章非常多,但是我觉得写得非常好的就是这位大牛的,我基本上就是使用他的这种方案,然后加入了自己的元素.这位大牛是通过Activity实现的,我稍作修改

android动态加载(二)

上一篇说了android中的动态加载,即在android工程中动态加载经过dx操作以后的jar文件和没有安装的apk文件,今天我们来看看怎么执行已经安装的apk中的类中的方法. 所以,我们会需要两个工程,一个是plugone,这个是我们暴露给外面的方法的一个android工程.另外一个我们暂且给他起名为useplugone吧. 先来看看plugone工程,我们在plugone工程中有这样一个类,用来暴露给调用者一个方法: package com.example.plugone; public c

Android动态加载Dex机制解析

1.什么是类加载器? 类加载器(class loader)是 Java?中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中. Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件).类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例.每个这样的实例用来表示一个 Java 类.通过此实例的 newInstance()

Android动态加载那些事儿

基础 1.Java 类加载器 类加载器(class loader)是 Java?中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式.加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi?中的应用. 2.反射原理 Java 提供的反射機制允許您於執行時期動態載入類別.檢視類別資訊.生成物件或操作生成的物件,要舉反射機制的一個應用實例,就

Android动态换肤开源库Colorful发布

最近本人需要用到夜间模式,但是经过一番搜索似乎并没有看到好的开源实现,看到有一个类似的库MultipleTheme,但是需要自定义所有要实现换肤功能的View,感觉比较麻烦.当发现现有的解决方案不能很好的解决问题时,往往只能自己实现,因此本人花了点时间简单弄了一个实现该功能的开源库,命名为Colorful. Colorful是基于Theme,无需重启Activity.无需自定义View,方便的实现日间.夜间模式,github地址为 https://github.com/bboyfeiyu/Col

Android动态加载框架DL的架构与基本原理解析

转载请注明出处,本文来自[ Mr.Simple的博客 ]. 我正在参加博客之星,点击这里投我一票吧,谢谢~ 前言 最近这一两年,Android App使用插件化技术开发的数量越来越大,其实还是业务地快速膨胀导致,需求越来越多,App越来越臃肿.虽然手机的内存空间不断地的增大,但是太大的安装包给用户也造成了心理压力.于是大家都会想到插件化的开发方式,把App做成一个平台,而不是一个独立的app.平台上可以集成各种各样的功能,功能模块也插件的形式添加进来,这些插件不需要安装,只需要用户按需下载到某个

android 动态壁纸开发

转:http://www.eoeandroid.com/thread-100389-1-1.html android 动态壁纸开发参考:http://www.ophonesdn.com/article/show/278推荐:http://www.oschina.net/code/snippet_203635_7426http://blog.csdn.net/homebei2/article/details/6079580resources/articles/live-wallpapers.htm

Android 动态设置控件高度

TextView textView= (TextView)findViewById(R.id.textview); LinearLayout.LayoutParams linearParams =(LinearLayout.LayoutParams) textView.getLayoutParams(); //取控件textView当前的布局参数 linearParams.height = 20;// 控件的高强制设成20 linearParams.width = 30;// 控件的宽强制设成3