小天带你了解java反射

  在学习框架的时候,总是对各种注解感到非常的费解。为什么可以这样写,为什么能实现这种功能,很迷茫。java反射和注解开发相当于框架的一个基础。

反射

  什么是反射?

    

    java反射机制是在运行状中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能成为java语言的反射。

    黑人问号???

    这他妈是啥?我也不知道。

    说人话就是
    反射是java api,是java提供的现成的类。接受api提供的功能
    是java提供的动态执行机制,动态加载类,动态创建对象,动态访问属性,动态调用方法。

  静态与动态

    

     静态:实现约定的规则,执行期间按照固定规则执行。
     动态:实现没有约定,在执行期间动态确定执行规则。
     java中的静态执行,编译已经就确定执行规则(执行次序),在运行期间按照编译结果顺序执行。

    

Foo foo = new Foo();
foo.hello();

    java中的动态执行:运行期间才能确定加载哪些类,创建哪些对象,执行哪些方法。

    Class类

      Object中有一个方法 getClass()可以返回一个Class对象。
      Class这个类用于模拟一个类的属性、方法、构造器。

      获取class对象的三种方式
      1、Class.forName("")
      只需要知道名称
      2、obj.getClass();
      只需要这个对象
      3、obj.class
      需要对象

 

      获取Class对象的属性
      Field field = cls.getDeclaredField("属性名")
      获取的属性会以field对象来表示。

 

      获得构造器
      cls.getDeclaredConstructor("class数组 内含构造器参数的class对象")
      cls.getDeclaredConstructor(new Class[]{Integer.class});
      获得所有的构造器
      cls.getDeclaredConstructors();

 

      动态创建对象
      Object obj = cls.newInstance();
      只能调用无参的构造函数,即默认的构造函数
      抛出所有由别调用构造函数抛出的异常。
      要求被调用的构造函数是可见的,也即必须是public类型的
      Object obj = constructor.newInstance(new Object[]{});
      可以根据传入的参数,调用任意构造函数
      在特定的情况下,可以调用私有的构造函数。
      执行cls引用的类信息中的无参数构造器,动态创建实例。如果类没有无参数构造器,则抛出异常!

      反射可以调用有参数构造器。

 

      动态获取类的方法信息
      反射api提供了动态获取类中方法信息的api:
      Method[] ary = cls.getDeclaredMethods();

      获得一个具体的方法
      cls.getDeclaredMethod("方法名称","Class<?> ...parameterTypes(三个点代表java的可变参数,也就是数组");
      第二个参数就是形参的class对象

 

      Method提供了获取方法详细信息的方法:
      //获取方法名
      String name = method.getName();
      用法:还记得Spring在写DAO的时候必须要添加get、set方法吗?为什么必须这么做呢?因为只有这样,Spring才能找到这种方法
      //遍历的时候加入一个这样的判断,就可以判断get方法
      boolean isget = name.startWith("get")
      //同上可以判断set方法
      boolean isset = name.startWith("set")
      再强调一下规范的重要性,如果不遵守程序员之间的规范,很多东西会非常非常的不方便,甚至无法使用高级的框架。

 

      //获取返回值类型
      Class type = method.getReturnType();

 

      动态执行方法
      invoke:调用method方法
      语法:
      method.invoke(执行方法的对象,传递的参数)

 

      必须在对象上执行一个非静态方法,调用方法时候必须有对象。
      在invoke方法执行时候,必须传递包含当前方法的对象。

 

 

反射用途

  1、eclipse中解析类的结构使用了反射

  2、JUnit识别被测试方法使用了反射
  3、Spring管理Bean对象,注入Bean属性使用了反射
  利用反射创建Bean对象实例
  利用反射注入Bean的属性
  4、注解的解析使用了反射
  利用反射api支持注解
  5、强行执行私有方法

posted on 2017-09-22 14:45  湖中之天  阅读(115)  评论(0)    收藏  举报

导航