一、反射调用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. android 更新sdk ip
  2. android ImagView缩放方法之一(Bitmap)
  3. android调用浏览器打开网页链接
  4. MediaExtractor的seekTo方法精确定位到指定帧
  5. (Android)调用百度地图api之添加覆盖物
  6. android scrollview嵌套listview出现高度显示不全解决方案
  7. 在Android中使用NDK调用OpenGl
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Cocos2dx3.2从零开始【一】Cocos2d-x 3.2
  2. android工程结构详细解析
  3. Android(安卓)兼容性测试(CTS)
  4. Android(安卓)4.0音乐问题
  5. android中使用GoogleMap的地理位置服务
  6. 看了你就懂的同步与异步、阻塞与非阻塞
  7. Android(安卓)JNI技术介绍
  8. webview发展现状
  9. udacity android 实践笔记: lesson 4 par
  10. Android(安卓)Apk 代码混淆与资源文件混