zoukankan      html  css  js  c++  java
  • 反射机制

    一、什么是反射机制?

      反射Reflect:通过Java反射机制,我们可以在程序中访问已经装在到JVM中的对象的属性、方法,实现访问、检测、修改的功能。关于反射的一些方式存在于Java.lang.reflect包下。

    二、反射机制都能反射到哪些东西?

      包路径、类名称、继承类、实现接口、构造方法、方法、成员变量、内部类、内部类的声明类

      在通过getFilelds()和getMethods()方法依次获得权限为public的成员变量和方法时,其中包含从超类继承到的成员变量和方法。而通过getDeclaredFields()和getDeclaredMethods()方法获得所有权限的成员变量和方法时只能获得本类中的。

    三、访问构造方法后的一些操作

      对于构造方法的操作用两种情况:

      (1):权限为可获得的情况下,使用构造方法实例化对象可以使用newInstance()方法。

        (2)   : 权限为private的情况下,首先需要使用方法setAccessible(boolean flag),将其中的参数设置成true。之后再使用newInstance()方法。

      注意:newInstance(Object o)在有参数的情况下会按照给定的参数实例化对象,在没有参数的情况下将会使用默认的无参构造。

    四、访问成员变量

      方法:getFields()、getField(String name)、getDeclaredFields()、getDeclaredField

      如果指定成员变量,那么可以通过名称来访问,例如:object.getDeclaredField("String src");

    五、访问方法

      方法:getMethod()、getMethod(String name,Class<?>···parameterTypes)、getDeclaredMethods()、getDeclaredMethod(String name,Class<?>···parameterTypes)

      如果是访问指定的方法,需要根据方法名称、入口参数来访问,例如:object.getDeclaredMethod("MethodName",String.class,int.class );

    或者:object.getDeclaredMethod("MethodName",new class[]{String.class,int.class } );

      在这里重点标记一个方法,有点熟悉但是不知道在哪里见过:

      invoke(Object obj,Object···args):利用指定参数args操作指定对象中的该方法,返回值类型是object

    总结:通过反射机制我们可以获得对象一些属性,并且可以对这些属性进行操作,强大之处是它可以在程序运行过程中反射,我认为这是反射机制强大最主要的原因。目前接触到的反射有ClassForName.这个反射我各人看来有窥一斑而知全豹的感觉,也就是说给一个方法的某一个属性,例如方法名字,就可以获得整个类,继而可以使用它的所有方法。但是反射还有一个弊端就是效率低,因为反射需要获得方法的权限信息,为了优化,使用setAccessible方法屏蔽安全访问。

    引用地址:http://www.cnblogs.com/tartis/p/9299135.html

    通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式(未学习)等设计模式,同时也可以解决Java泛型擦除(未学习)等令人苦恼的问题。

    spring 的 ioc/di(未学习) 也是反射....
    javaBean和jsp(未学习)之间调用也是反射....
    struts的 FormBean(未学习) 和页面之间...也是通过反射调用....
    JDBC 的 classForName()也是反射.....
    hibernate的 find(Class clazz) (未学习)也是反射....

  • 相关阅读:
    服务器建设问题
    JDBC --反射(二)
    Cookies
    http和https区别
    springboot常用注解
    线程池
    悲观锁和乐观锁
    java高并发下的数据安全
    idea解决mybatis逆向工程
    spring Cloud
  • 原文地址:https://www.cnblogs.com/tutuhome/p/10664172.html
Copyright © 2011-2022 走看看