Java反射——如何通过Java中的反射调用对象的方法?_极悦注册
专注Java教育14年 全国咨询/投诉热线:444-1124-454
极悦LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java反射——如何通过Java中的反射调用对象的方法?

Java反射——如何通过Java中的反射调用对象的方法?

更新时间:2019-08-15 10:50:31 来源:极悦 浏览1922次

 


    一、Java反射拿到调用对象的方法


  1、通过Class.forName(“包名+方法的类名”)拿到方法的对象;


  如:Class clazz = Class.forName("ReflectionTest");


  也可以通过实例,获取方法的对象类,


  如:String str = "test , reflection";


  Class clazz = str.getClass();


  2、明确反射方法名称 ;


  3、明确方法的参数类型,就可以拿到对象的方法。


  如:Method method = clazz.getMethod("test",String.class,int.class);



  二、接着就是invoke()调用方法了:


  1、实例化对象,可以直接调用已创建的对象,也可以newInstance()一个。


  2、确定具体方法的参数


  如: Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);


  System.out.println("直接反射:"+obj1);



  三、补充一些关于Java反射的知识:


  Java反射的作用:在Java代码编译时,可以通过反射访问装载到JVM中类的内部信息。


  如: Clazz.getName()获取类的完整名字


  getPackage()获取此类所属的包


  getSuperclass() 获取父类对应的Class对象


  getFiled(String name) 获得类的指定成员变量


  getMethods() 获得类的public类型的方法


  getMethod(String name, Class[] args) 获取类的指定方法



  四、具体实例:


  import java.lang.reflect.InvocationTargetException;


  import java.lang.reflect.Method;


  public class ReflectionTest {


  public String test(String name ,int age) {


  return name+",今年"+age+"岁,是一个极富好奇心地乐观青年!";


  }


  public static void main(String args[]) {


  String str = "test , reflection";


  int len1 = str.length();


  System.out.println("直接调用length() :"+len1);


  //反射String.length()方法


  //直接填入调用该方法的对象str,这里不需要newInstance()


  Object len2 = Reflection(str,str.getClass(),"length",null,null);


  System.out.println("java 反射调用length() :"+len2);


  Class clazz;


  try {


  //调用自己创建的函数,


  //反射得到类 包名+类名,我这边没有包名就直接是 "ReflectionTest"


  clazz = Class.forName("ReflectionTest");


  //直接java反射得到方法


  Method method= clazz.getMethod("test",String.class,int.class);


  Object obj1 = method.invoke(clazz.newInstance(),"xiaojun",23);


  System.out.println("直接反射:"+obj1);


  //创建函数完成反射


  //创建参数class 类型的数组


  Class cla[] = {String.class,int.class};


  Object obj = Reflection(clazz.newInstance(),clazz,"test",cla,"小君",22);


  System.out.println("创建函数完成反射: "+obj);


  } catch (ClassNotFoundException 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 (NoSuchMethodException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (SecurityException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (IllegalArgumentException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (InvocationTargetException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  }


  }


  /*


  * 通过反射执行cclass的方法


  * @param object ---调到该方法的具体对象


  * @param cclass ---具体对象的class类型


  * @param paramClasses ---反射方法中参数class类型


  * @param methodName ---反射方法的名称


  * @param args ----调用该方法用到的具体参数


  *


  *


  * */


  public static Object Reflection(Object object ,Class cclass,String methodName,Class[] paramclasses, Object... args) {


  try {


  Method method = cclass.getMethod(methodName,paramclasses);


  return method.invoke(object,args);


  } catch (NoSuchMethodException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (SecurityException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (IllegalAccessException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (IllegalArgumentException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  } catch (InvocationTargetException e) {


  // TODO Auto-generated catch block


  e.printStackTrace();


  }


  return null;


  }


  }


  /* 运行结果:


  直接调用length() :17


  java 反射调用length() :17


  直接反射:xiaojun,今年23岁,是一个极富好奇心地乐观青年!


  创建函数完成反射: 小君,今年22岁,是一个极富好奇心地乐观青年!*/



提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>