一、反射调用static方法携带参数:
ClassLoader loader = MainActivity.class.getClassLoader();
Class> clz;
clz = loader.loadClass("com.example.jbptest.TestFunction"); //加载类
Method m = clz.getDeclaredMethod("add",int.class,int.class); //获取方法m.invoke(clz, 2, 4); //反射调用,static方法调用时,不必得到对象示例
二、反射调用非static方法不带参数:
ClassLoader loader1 = MainActivity.class.getClassLoader();
Class> clz1;
clz1 = loader1.loadClass("com.example.dexfile.DexFileTest2"); //加载类 :包名+类名
Method m1 = clz1.getDeclaredMethod("testInstanceof"); //获取方法
Object methodobject1 = clz1.newInstance(); //实例化对象
m1.invoke(methodobject1); //反射调用
三、另一种反射调用方式:
Class dexfiletest2 = Class.forName("com.example.jbptest.TestFunction"); //初始化类:包名+类名
Methon method = dexfiletest2.getMethod("testInstanceof");
Object methodobject1 = dexfiletest2.newInstance(); //调用静态方法则不需要实例化这步
method.invoke(methodobject1); //反射调用
dexfiletest2.getname();
第一步:获取class
第二步:获取method
第三步:实例化
第四步,调用invoke
Class.forName("xx.xx")与loader.loadClass("xx.xx")的区别:
Class的装载分了三个阶段,loading,linking和initializing
loader.loadClass("xx.xx")没有执行初始化,执行的是更底层的操作
只有执行cls.NewInstance()才能够初始化类,得到该类的一个实例
Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。
forName支持数组类型,loadClass不支持数组
一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
另一个例子:
package javascript;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
class DefineClassLoader{
void testLoader(){
System.out.println("ClassLoader Test");
}
}
class Tester{
static{
System.out.println("Tester");
}
static void testLoader1(){
System.out.println("Tester Test");
}
}
public class ClassLoaderTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException {
// TODO Auto-generated method stub
ClassLoader cl = ClassLoader.getSystemClassLoader();
Class> cl3 = cl.loadClass("javascript.DefineClassLoader"); //加载类,需要用包名+类名
System.out.println(cl3);
Class> cl2 = Class.forName("javascript.Tester"); //初始化类,需要用包名+类名
System.out.println(cl2);
Method m = cl3.getDeclaredMethod("testLoader"); //获取方法
Object methodobject1 = cl3.newInstance(); //实例化
m.invoke(methodobject1); //反射调用
Method m1 = cl2.getDeclaredMethod("testLoader1"); //静态方法不需要实例化
m1.invoke(cl2); //反射调用
}
}