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

    反射机制:

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

    在Java的反射中我们首先要了解class类 以及反射所涉及的api反射的api包是:java.lang.reflect包

    Class类:

    在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。JVM利用运行时信息选择相应的方法执行。而保存这些信息的类称为Class

    它能做什么?Class类可以帮助我们在程序运行时分析类,说白了就是获取类中的值

    可能瞬间就想到了反射,没错!Class一般就是和反射配套使用的,因为我们向Class提供一个类或一个类的类名,Class就可以提供我们很多信息,比如属性/方法/修饰符/构造器/类名等等。然后我们就可以进一步进行反射。

    通过Class来获取对象: 

    1. 根据类名:类名.class
    2. 根据对象:对象.getClass()
    3. 根据全限定类名:Class.forName(全限定类名)
    //        获取Person的class对象的方式
            Person person  = new Person ();
            System.out.println (person.getClass ());
            System.out.println (Person.class);
            System.out.println (Class.forName ("com.wuzhilong.Person"));
    
    //        获取全限定类名
            System.out.println (person.getClass ().getName ());
            //获取类名
            System.out.println (person.getClass ().getSimpleName ());
    //         实例化
            System.out.println (person.getClass ().newInstance ());
    View Code

    获取类中的构造方法以及构造方法中的参数

      Class personClass =  Class.forName ("com.wuzhilong.Person");
                //获取所有的构造方法
             Constructor[] constructors = personClass.getConstructors ();
               //取消安全性检查,设置后才可以使用private修饰的构造方法,也可以单独对某个构造函数进行设置
             Constructor.setAccessible (constructors,true);
    
             for (Constructor constructor:constructors){
               // 获取构造方法中的参数
               Class<?> parmenterTypeClass[] =   constructor.getParameterTypes ();
    
               for (Class<?> classtype:parmenterTypeClass){
                   //参数类型
                   System.out.println (classtype.getName ());
               }
    
             }
    View Code

    获取类中的属性

           //获取字节码文件
          Class classPerson =  Class.forName ("com.wuzhilong.Person");
    
            //获取实例对象
         Person person =(Person) classPerson.newInstance ();
    
         //获取共有的成员变量
            Field  field = classPerson.getField ("name");
               field.set (person,"xiaoming");
               System.out.println (field.get (person));
            //获取类中的所有的成员变量
    
            Field  field1 = classPerson.getDeclaredField ("pwd");
    
    //        设置私有属性的可见权限
    
            field1.setAccessible (true);
    
    //        操作成员变量:给属性赋值
            field1.set (person,"123456");
    
    //        获取属性值
            System.out.println (field1.get (person));
    View Code

    获取方法执行

            //获取字节码文件
            Class classPerson =  Class.forName ("com.wuzhilong.Person");
    
            //获取实例对象
            Person person =(Person) classPerson.newInstance ();
    
            //获取方法   :第一个参数:方法名   第二个参数:方法的参数
            Method  method = classPerson.getMethod ("show",null);
    
            //调用方法: method.invoke (obj,object....args)  第一个参数:方法的对象
            //第二个参数:方法的实际参数值,没有则不填
            method.invoke (person);
    View Code
  • 相关阅读:
    有趣的面试题 11 单向链表
    CLR via C# 读书笔记 13 前台线程和后台线程
    c# 使用 new 操作符构造新对象中做了一些什么 (简单版)
    CLR via C# 读书笔记 11 何时使用线程或者线程池
    CLR via C# 读书笔记 31 一种单实例应用程序的实现(信号量)
    延时加载lazyload
    [评论]为什么中国的程序员技术偏低
    关于陈列设计和一些细节的体验
    滚动
    JavaScript 的 parseInt 取整
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9857026.html
Copyright © 2011-2022 走看看