美文网首页
反射学习

反射学习

作者: 单调的灵魂 | 来源:发表于2021-08-18 17:37 被阅读0次

反射

  • 在运行时动态的获取类的完整信息
  • 增加程序的灵活性
  • JDK 动态代理使用了反射

概述

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

  • 对类,可以获取其所有的属性和方法
  • 对对象,可以调用其任意方法和属性
  • 获取的过程是借用class对象来实现的
    • 每个类都有一个class文件(字节码)
    • 加载的时候,会将class文件转换为class对象

基础使用

获取class对象的三种方式

三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中等多种方法。

  1. 通过getClass()方法
Person p1=new Person();
Class c1=p1.getClass();
  1. 通过类名的属性.class来获取(任何数据类型都有这个静态属性,包括基本类型数据属性),安全可靠,性能更高
Class c1=Person.class
  1. 通过Class类的forName()静态方法来获取,使用最多
Class c1=Class.forName("com.xxx.Person")

一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 class对象进行 equals 比较,发现都是true

class类常用方法

declared:通常是指类声明的,所以不包含继承

直接去获取类的某项属性的话,只能访问到为public修饰的属性,包含继承的

  • getName() 获取类完整的名字

     String className = c1.getName();
     System.out.println(className);//输出com.xx.Person
    
  • getFields() 获取类的public属性(包括继承的一些public修饰的属性)

          Field[] fields=c1.getFields();//这里的field是字段的意思
          for(Field field:fields){
                System.out.println(field.getName());//只有public修饰的属性,包括继承的一些public修饰的属性
             }
    
  • getDeclaredFields() 获取类的 声明的所有属性(不包含继承)

            Field[] fields=c1.getDeclaredFields();
            for(Field field:fields){
                System.out.println(field.getName());//所有类声明的属性
            }
    
  • getMethods()获取类的public方法(包括继承的一些public修饰的方法)

           Method[] methods=c1.getMethods();
            for (Method method : methods) {
                System.out.println(method.getName());//包含类的所有的public方法,包括继承的一些方法,(不会包括类的构造方法)
            }
    
  • getDeclaredMethods()获取类的声明的所有方法(不包含构造方法,不包含继承)

            Method[] methods=c1.getDeclaredMethods();
            for (Method method : methods) {
                System.out.println(method.getName());
            }
    
  • getConstructors()获取类的public的构造方法(不包含继承来的)

            Constructor [] constructors=c1.getConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor.toString());
            }
    
  • getDeclaredConstructors() 获取类声明的所有构造方法

            Constructor [] constructors=c1.getDeclaredConstructors();
            for (Constructor constructor : constructors) {
                System.out.println(constructor.toString());
            }
    
  • getConstructor()获取指定参数类型的构造方法

            Constructor constructor=c1.getConstructor(String.class);
    
  • getField(String name)获得指定类的public属性,只能获取由public修饰的属性,包括继承来的

            Field field=c1.getField("xx");
            System.out.println(field);
    
  • getDeclaredField(String name) 获取指定类声明的的属性,不包括继承来的

            Field field=c1.getDeclaredField("f");
            System.out.println(field);
    
  • 反射中的另外一个常用方法setAccessible() 设置是否打开java 的语言访问检查

    • MethodFieldConstructor类型的方法
    • true表示关闭语言访问检查,可以提高反射的性能
    • 调用私有方法或者获取私有属性需要关掉检查
          Method m = c1.getDeclaredMethod("getUname", null);
          m.setAccessible(true);
    

Field 字段的使用

set(obj,value) 设置对象对应字段的值

    Field field=c1.getField("a");
    // 如果为私有属性,需要关掉检查来进行改变
    field.set(o,6);// 设置o对象a的值为6

Constructor构造器的使用

newInstance() 生成新实例

    Constructor constructor=c1.getDeclaredConstructor(int.class,int.class);
    //如果是私有的构造方法时关掉检查即可
    //constructor.setAccessible(true);//关掉检查
    Object o =constructor.newInstance(2,3);

Method 方法的使用

invoke(Object obj, Object... args) 调用方法

Method method=c1.getMethod("sayHello");
    //如果是私有的方法时关掉检查即可
method.invoke(o,null);// 无参为null

应用

https://blog.csdn.net/sinat_38259539/article/details/71799078

相关文章

  • Python学习打call第三十二天:反射

    今天学习的是反射,主要学习一下什么是反射?具有反射能力的内置函数有哪些?反射魔术方法有哪些? 1.什么是反射 解释...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java反射学习&总结

    反射在框架中使用很广泛,比较重要,没有反射一些功能我们无法实现,所以学习反射是比较重要的。下面链接是我学习反射的一...

  • 反射学习二——反射

    java高级之反射 一、反射入门 在方法区存在这么一些对象,叫做类对象,他们表述了我们写的所有的类,当我们new对...

  • 胖哥说反射 上卷

    我来学习反射 1.为什么我们要学习反射? 通过反射机制可以获取到一个类的完整信息,例如:所有(包含private修...

  • 《教育心理学》读书笔记

    第一部分学习的本质 学习即条件反射——巴甫洛夫经典条件反射实验 实验应用 巴甫洛夫认为,人类的学习就是条件反射建立...

  • 6.22 周五

    下午学习公益课堂 脚底反射,耳朵反射,手掌反射,越鼓掌身体越好。说自己喜欢掌声。 偏见: 主要在见,...

  • 反射机制学习

    第一次写,写的不好 反射机制 百度百科中的反射概念:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个...

  • Java学习:反射

    反射 使用反射可以直接获取class字节码文件中的类型、属性、方法。 演示代码: 新建一个名为User的类作为反射...

  • 反射机制学习

    参考文献:https://www.cnblogs.com/ysocean/p/6516248.htmlhttps:...

网友评论

      本文标题:反射学习

      本文链接:https://www.haomeiwen.com/subject/gwsabltx.html