类似于exe可以动态加载dll一样,Android中也存在动态加载的机制,通过反射机制可以动态加载另一个dex中的方法以及属性。这些方法和属性包括pulic或者private的方法。
思路大致为:首先制作一个apk,里面存在一个private的方法getMoney(),然后通过DexClassLoader方法动态加载另一个apk中的类,在反射类中获取getMoney方法。
package com.example.testb;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if itis present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private StringgetMoney(){
return "2";
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String path = "/data/";
String filename = "TestB.apk";
Context context =getApplicationContext();//获取Context对象;
DexClassLoader classLoader = new DexClassLoader(path +filename, dexOutputDir.getAbsolutePath(),
null,getClassLoader());
try {
Class mLoadClass =classLoader.loadClass("com.example.testb.MainActivity");
Constructor constructor = mLoadClass.getConstructor(newClass[]{});
Object TestBActivity = constructor.newInstance(newObject[]{});
Method getMoney = mLoadClass.
getDeclaredMethod("
getMoney", null);
getMoney.setAccessible(true);
Object money = getMoney.invoke(TestBActivity, null);
Toast.makeText(this, money.toString(),Toast.LENGTH_LONG).show();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException
e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetExceptio
n e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if itis present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}