一、反射调用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)了。

LoadClass()方法加载类及初始化过程:
类加载(loadclass())(加载)——》newInstance()(链接+初始化)
newInstance():
(开始连接)静态代码块——》普通变量分配准备(a=0;b=0;c=null)——》(开始初始化)普通变量赋值(a=1;b=2;c=”haha”)——》构造方法——》初始化成功。
Class.forName(Stirng className)一个参数方法加载类及初始化过程:
类加载(Class.forName())(加载)——》静态代码块——》newInstance()(链接+初始化) newInstance():
(开始连接)普通变量分配准备(a=0;b=0;c=null)——》(开始初始化)普通变量赋值(a=1;b=2;c=”haha”)——》构造方法——》初始化成功。


另一个例子:

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);  //反射调用

}


}

更多相关文章

  1. MediaExtractor的seekTo方法精确定位到指定帧
  2. Android通过Uri获取文件的路径的方法
  3. android使用全局变量的方法
  4. Android里把View切换圆角的方法
  5. Android 平板电脑的判断方法
  6. Android Studio之——问题集合及解决方法(对号入座)

随机推荐

  1. Android解决WifiManager.removeNetwork()
  2. Android(安卓)Binder Mechanism (3) --
  3. Android(安卓)之 设置EditText最大可输入
  4. Android图片选择器、多选框架
  5. Android(安卓)studio 上传Android(安卓)l
  6. Android(安卓)ApiDemos示例解析(73):Grap
  7. Android(安卓)- 资源(resource)
  8. Android(安卓)studio aar文件的打包过程
  9. Android原生音量控制实例详解
  10. ContentProvider 详解