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

    前言

            反射是一切框架的基础,当需要在程序运行时获取对象的构造函数、属性、方法时需要用到反射。

    反射的三种方式

         三种方式比较起来常用第三种

        1.1 Student student=new Student();

              Class clazz=student.getClass();

        1.2  Class clazz=Class.forName("com.zhangfei.Student");

        1.3  Class clazz=Student.class; 

    反射获取构造函数

          Class clazz=Class.forName("com.zhangfei.Student");
    
    
                Constructor[] cons=clazz.getConstructors();
                System.out.println("获取公共的构造函数=========");
                for(Constructor con:cons){
                    System.out.println(con);
                }
    
                System.out.println("获取所有的构造函数,包括共有,私有、受保护的=========");
                cons=clazz.getDeclaredConstructors();
                for(Constructor con:cons){
                    System.out.println(con);
                }
    
                System.out.println("1、调用公共构造函数创建一个对象========");
                Constructor constructor=clazz.getConstructor(null);
                Student student=(Student) constructor.newInstance();
    
    
                System.out.println("2、调用包含一个参数的公共构造函数创建一个对象=========");
                constructor=clazz.getConstructor(String.class);
                student=(Student)constructor.newInstance("zhangfei");
    

      

    反射获取属性

            Field[] fields=clazz.getFields();
                System.out.println("3、获取共有属性=======");
                for(Field f:fields){
                    System.out.println(f);
                }
    
    
                fields=clazz.getDeclaredFields();
                System.out.println("4、获取所有属性包括共有、私有、受保护的=======");
                for(Field f:fields){
                    System.out.println(f);
                }
    
    
                System.out.println("5、给私有属性name赋值:=========");
                Field field=clazz.getDeclaredField("id");
                field.setAccessible(true);
                field.set(student,1);
    
                Field field2=clazz.getDeclaredField("name");
                field2.setAccessible(true);
                field2.set(student,"zhangfei");
    
                Field field3=clazz.getDeclaredField("age");
                field3.setAccessible(true);
                field3.set(student,30);
    
                System.out.println(student.toString());
    

      

    反射获取方法

           这里获取共有方法时会把继承自object对象的方法也获取到。

    
    
           System.out.println("6、获取公有方法===============");
                Method[] methods=clazz.getMethods();
                for(Method method:methods){
                    System.out.println(method);
                }
    
    
                System.out.println("7、获取所有方法,包括公有、私有、受保护的方法========");
                methods=clazz.getDeclaredMethods();
                for(Method method:methods){
                    System.out.println(method);
                }
    
                System.out.println("8、调用共有方法并调用=======");
                Method method=clazz.getMethod("show1");
                method.setAccessible(true);
                method.invoke(student);
    
    
                System.out.println("9、调用受保护的方法并且传参=======");
                method=clazz.getDeclaredMethod("show2",String.class);
                method.setAccessible(true);
                method.invoke(student,"zhangfei");
    

      

  • 相关阅读:
    整理一下反射
    数据查询--整理(更新中)
    【Django】Django model与数据库操作对应关系(转)
    给定 2 个正整数 a, b,a 和 b 最多可能有 40 位,求出 a + b 的和(C语言实现)
    c++和QT实现俄罗斯方块,使用GraphicsView。
    C语言的动态函数库和静态函数库的生成和使用(linux环境下)
    linux内核驱动的知识要点
    简单的linux内核移植知识
    快速排序c++/c实现
    c语言系统函数——进程的创建
  • 原文地址:https://www.cnblogs.com/sword-successful/p/9179903.html
Copyright © 2011-2022 走看看