Java的反射机制

发表于:2018-5-22 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:贪挽懒月    来源:51testing软件测试网采编

#
java
#
JAVA
分享:
  前言:
  JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
  Java反射的使用:
  有如下student类:
  public class Student {
      private int age;
      private String name;
          public Student() {
           super();
      }
      public Student(int age, String name) {
          super();
          this.age = age;
          this.name = name;
      }
      public void study() {
          System.out.println("测试反射!");
      }
  }
  现在通过反射来获取student类的信息:
  一、获取class对象
  获取class对象有三种方式,如下:
  1、方式一:
  Class clazz =Class.forName("com.demos.reflect.Student");
  注意:forName里面的参数是Student的全类名。
  2、方式二:
  Class clazz = Student.class;
  3、方式三:
  Class clazz = stu.getClass();
  注:这种方法是已有该类的对象时使用,即已有stu对象。
  二、获取类的信息
  得到了Class对象后,就可以通过Class对象获取类的信息,部分方法如下:
  1、获取属性:
  Field[] fs = clazz.getDeclaredFields();//获取所有属性
          for(Field f : fs) {
              //获取属性名
              System.out.println(f.getName());
              //获取属性的数据类型
              Class pp = f.getType();
              System.out.println(pp.getName());//类型带包名
              //System.out.println(pp.getSimpleName());//不带包名
          }
  2、获取类的方法:
  //拿单个方法(study方法有参数的话还得写上参数类型,
          //例如:clazz.getMethod("study",String.Class))
          //Method m = clazz.getMethod("study");//获取单个方法
          //Method[] ms = clazz.getMethods();//包括父类方法
          Method[] ms = clazz.getDeclaredMethods();//不包括父类方法
          for(Method m : ms) {
              //获取类的方法名
              System.out.println(m.getName());
          }
  三、动态创建对象,调用方法
  1.1、创建对象方式一:
  Object obj = clazz.newInstance();
  System.out.println(obj);
  注意:这种方式创建对象因为没传参数,所以Student类必须要有一个无参构造。
  1.2、创建对象方式二:
  Constructor cos = clazz.getConstructor(int.class,String.class);
      Object obj2 = (Student)cos.newInstance(20,"张三");
  System.out.println(obj2);
  注意:这种方式带参创建对象,需要有带参构造。
  2、调用方法:
  有了对象就可以调该类的方法,如下:
  Method m = clazz.getMethod("study");
  m.invoke(obj);
  控制台输出输出"测试反射",正是study方法里打印的那句话。
  总结:
  Java的反射机制应用非常广泛,像spring、hibernate等框架底层都用到了反射,理解反射机制,可以帮助我们更好的理解这些框架的原理。



上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号