zoukankan      html  css  js  c++  java
  • java中的反射机制浅析

    1.反射机制的理解

    • 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
    • 对于任意一个对象,都能够调用它的任意一个方法和属性
    • 类中有什么信息,利用反射机制就能可以获得什么信息,不过前提是得知道类的名字

    2.反射机制的作用

    • 在运行时判断任意一个对象所属的类;
    • 在运行时获取类的实例对象;
    • 在运行时访问对象的属性,方法,构造方法等;
    • 结合工厂模式实现了Spring中的IoC。

    3.反射机制的应用背景

    反射机制实现了动态创建对象和编译,体现出很大的灵活性。对于一个大型的软件来说,不可能一次就把它设计的很完美,当这个程序编译后,发布了,当发现需要更新某些功能时,我们不可能要用户把以前的卸载,再重新安装新的版本,假如这样的话,这个软件肯定是没有多少人用的。采用静态的话,需要把整个程序重新编译一次才可以实现功能的更新,而采用反射机制的话,它就可以不用卸载,只需要在运行时才动态的创建和编译,就可以实现该功能。

    4.反射机制的示例

    先创建一个Person类,包括成员属性、成员方法。

    1 public class Person {
    2 
    3     public String name;
    4     
    5     public void run() {
    6         System.out.println("This person is running!");
    7     }
    8     
    9 }

    通过反射机制获取Person类的信息,并且访问和调用成员属性和成员方法。

     1 import java.lang.reflect.Field;
     2 import java.lang.reflect.InvocationTargetException;
     3 import java.lang.reflect.Method;
     4 
     5 /*
     6  * java中的反射机制解析:
     7  *     1.通过反射机制,可以在程序运行时获取类的信息
     8  *         方法:通过类名.class得到
     9  *              通过Object的getClass()方法得到,适用于不知道类型的情况
    10  *              通过全类名获取,用的比较多
    11  *     2.通过反射机制创建实例对象、获取成员方法、调用成员方法、获取成员属性、设置属性
    12  *         注意:反射机制 + 工厂模式 = Spring中的IoC
    13  */
    14 public class ReflectTest {
    15 
    16     public static void main(String[] args)
    17             throws ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalArgumentException,
    18             InvocationTargetException, NoSuchFieldException, InstantiationException, IllegalAccessException {
    19         Class clazz = null;
    20 
    21         // 通过类名.class得到
    22         clazz = Person.class;
    23         System.out.println("通过类名得到:" + clazz);
    24 
    25         // 通过Object的getClass()方法得到,适用于不知道类型的情况
    26         Object obj = new Person();
    27         clazz = obj.getClass();
    28         System.out.println("通过getClass方法得到:" + clazz);
    29 
    30         // 通过全类名获取,用的比较多,但是会抛出ClassNotFoundException异常
    31         clazz = Class.forName("codeAnal.Person");
    32         System.out.println("通过全类名获取:" + clazz);
    33 
    34         /*
    35          * 创建实例化对象、获取方法、调用方法、获取属性、设置属性
    36          *      注意此处需要抛出异常
    37          */
    38         // 获取实例化对象
    39         Object object = clazz.newInstance();
    40         System.out.println("实例对象" + object);
    41         // 获取类中的方法
    42         Method method = clazz.getDeclaredMethod("run");
    43         System.out.println("方法:" + method);
    44         // 调用类中的方法
    45         method.invoke(object);
    46         // 获取属性
    47         Field field = clazz.getDeclaredField("name");
    48         // 设置属性
    49         field.setAccessible(true);
    50         field.set(object, "张三");
    51         System.out.println("人名:" + field.get(object));
    52 
    53     }
    54 }

    本文只是简单介绍了一下Java中的反射机制,详细了解请参考:http://www.cnblogs.com/Eason-S/p/5851078.html

                               

  • 相关阅读:
    有效解决 iOS The document “(null)” requires Xcode 8.0 or later.
    扫描项目里没有使用的图片mac工具,删除没有使用的图片以减小包的体积
    苹果客服
    那些你不愿说给领导的话
    没有自动联想补齐代码的解决办法
    第三方的使用
    mac系统如何显示和隐藏文件
    导航栏
    svn(http)
    2020Python练习五
  • 原文地址:https://www.cnblogs.com/Wilange/p/7693016.html
Copyright © 2011-2022 走看看