• 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");
    

      

  • 相关阅读:
    编程习俗和设计模式
    Design Patterns Quick Memo
    Monty Hall Problem
    RPG game: the lost Roman Army
    A Geeky Game Idea
    App自动化测试:等待webview页面数据加载完成
    Android自动化测试元素定位
    IOS苹果开发者免费证书申请&使用Xcode打包
    pytest测试夹具(fixture)简介
    Unittest与Pytest参数化区别
  • 原文地址:https://www.cnblogs.com/sword-successful/p/9179903.html
Copyright © 2020-2023  润新知