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
  • 相关阅读:
    Java设计模式(学习整理)---工厂模式
    Java Swing 使用总结(转载)
    Java-生成验证码图片(自定义内容,尺寸,路径)
    二维码(带有图片)的生成
    J2se中的声音---AudioPlayer
    文件的读取和写入(指定路径)
    ASP.NET:使用Flurl制作可复用的分页组件
    ASP.NET:Forms身份验证和基于Role的权限验证
    ASP.NET:MVC模板化机制
    ASP.NET:MVC中文件上传与地址变化处理
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9857026.html
Copyright © 2011-2022 走看看