Spring16 - 回顾 Java反射 reflect

回顾Java反射

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。

要想解剖一个类,必须先要获取到该类的Class对象。而剖析一个类或用反射解决具体的问题就是使用相关API(1)java.lang.Class(2)java.lang.reflect,所以,Class对象是反射的根源

获取 Class对象,通过 Class对象完成实例化

  • 1 类名.class

  • Class clazz = Car.class;
    
  • 2 对象.getClass()

  • Class clazz = new Car().getClass();
    
  • 3 Class.forName("全路径")

  • Class clazz = Class.forName("com.atguigu.reflect.Car");
    
  • 通过 Class对象进行实例化创建对象

  • Car car = (Car)clazz.getConstructor().newInstance();
    

获取构造方法,通过构造方法完成实例化

  • 1 获取所有构造

  • // getConstructors()获取所有public的构造方法
    Constructor[] constructors = clazz.getConstructors();
    // getDeclaredConstructors()获取所有的构造方法public  private
    Constructor[] constructors = clazz.getDeclaredConstructors();
    
  • 2 指定有参数构造创建对象

  • //1 构造public
    Constructor c1 = clazz.getConstructor(String.class, int.class, String.class);
    Car car1 = (Car)c1.newInstance("夏利", 10, "红色");
    
    //2 构造private
    Constructor c2 = clazz.getDeclaredConstructor(String.class, int.class, String.class);
    //设置允许访问
    c2.setAccessible(true);
    Car car2 = (Car)c2.newInstance("捷达", 15, "白色");
    

获取属性

  • 1 获取所有public属性

  • Field[] fields = clazz.getFields();
    
  • 2 获取所有属性(包含私有属性)

  • Field[] fields = clazz.getDeclaredFields();
    
  • 遍历所有属性,对属性进行操作

  • for (Field field:fields) {
        if(field.getName().equals("name")) {
            //设置允许访问
            field.setAccessible(true);
            field.set(car,"五菱宏光");
            System.out.println(car);
        }
        System.out.println(field.getName());
    }
    

获取方法,通过 invoke 调用方法

  • 1 public方法

  • Method[] methods = clazz.getMethods();
    for (Method m1:methods) {
        System.out.println(m1.getName());
        
        //执行指定方法 比如,toString
        if(m1.getName().equals("toString")) {
            String invoke = (String)m1.invoke(car);
            System.out.println("toString执行了:"+invoke);
        }
    }
    
  • 2 private方法

  • Method[] methodsAll = clazz.getDeclaredMethods();
    for (Method m:methodsAll) {
        //执行指定方法 比如,run
        //需要先设置允许访问 .setAccessible(true)
        if(m.getName().equals("run")) {
            m.setAccessible(true);
            m.invoke(car);
        }
    }
    
posted @   LaViez  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示