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