我是靠谱客的博主 动听火龙果,这篇文章主要介绍java学习:反射机制,现在分享给大家,希望可以做个参考。

1.反射机制的作用

        通过java语言种的反射机制可以修改操作字节码文件。优点类似于黑客、可以读和修改字节码文件。通过反射机制可以操作代码片段。(class文件)

2.反射机制的相关类在哪个包下

        java.lang.reflect.*

3.反射机制的相关类有哪些

  1. java.lang.Class        代表整个字节码,代表一个类型
  2. java.lang.reflect.Method        代表字节码种的方法字节码
  3. java.lang.reflect.Constractor        代表字节码种的构造方法字节码
  4. java.lang.reflect.Field        代表字节码种的属性字节码
  5. 复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    java.lang.Class public class User{ //Field int no; //Constructor public User(){ } public User(int no){ this.no = no; } public void setNo(int no){ this.no = no; } public int getNo(){ return no; } }

4.获取class的三种字节码

  1. 复制代码
    1
    static Class<?> forName(String className)
    1. 返回与带有给定字符串名的类或接口相关联的 Class 对象。
    2. 静态方法
    3. 方法的参数是一个字符串
    4. 字符串需要一个完整类名
    5. 完整类名必须带有包名。java.lang包也不能省略
    6. 复制代码
      1
      Class c1 = Class.forName("java.lang.String");

      代表String类型

  2. 复制代码
    1
    final Class<?> getClass()
    1. 返回此 Object 的运行时类。返回的 Class 对象是由所表示类的 static synchronized 方法锁定的对象。
    2. 实际结果类型是 Class<? extends |X|>,其中 |X| 表示清除表达式中的静态类型,该表达式调用 getClass
    3. 复制代码
      1
      2
      String s = "abc" Class x = s.getClass();

      x代表String类型

  3. java语言中任何一种任何一种类型,包括基本数据类型,都有.class属性

    1. 复制代码
      1
      Class a = String.class

      a代表String类型

5.反射机制的灵活性

java代码写一遍不再改变java源代码的基础之上,可以做到不同对象的实例化。非常灵活

Spring,SpringMVC等高级框架底层实现原理都采用了反射机制。学习了反射机制有利于理解剖析底

6.如果只希望一个类的静态代码块执行,其他代码一律不执行。可以使用Class.forName("完整类名");Class.forName()这个方法执行会导致类加载,类加载是,静态代码块执行

7.获取类路径下文件的绝对路径

  1. String path = Tread.currentThread().getContextClassLoader().getResource("").getPath();
  2. Thread.currentThread()        当前线程对象
  3. getContextClassLoader()        是线程对象的方法,可以获取到当前线程的类加载器对象
  4. getResource("")        【获取资源】这是类加载器对象的方法,当前线程的类加载器默认从类的根路径下加载资源
  5. 以流的形式返回
  6. InputStream in = Tread.currentThread().getContextClassLoader().getResourceAsStream();

8.资源绑定器

  1. java.util包下提供了一个资源绑定器,便于获取属性配置文件中的内容。使用以下这种方式的时候,属性配置文件xxx.properties必须放到类路径下
  2. ResourceBundle bundle = ResourceBundle.getBundle("classinfo2");
  3. String className = bundle.getString("className");
  4. 资源绑定器,只能绑定xxx.properties文件,并且这个文件必须在类路径下。文件扩展名也必须是properties。并且在写路径的时候,路径后面的扩展名不能写

8.关于jdk种的类加载器

  1. 什么是类加载器
    1. 专门负责加载类的命令/工具
    2. ClassLoader
  2. jdk种自带的类加载器
    1. 启动类加载器:rt.jar
    2. 扩展类加载器:ext/*.jar
    3. 应用类加载器:classpath(环境变量)
  3. java种为了保证类加载的安全,使用了双亲委派机制
    1. 优先从启动加载器中加载,这个称为“父”“父”无法加载到的时候,在从扩展类加载器加载,这个称为“母”。双亲委派。如果都加载不到,才会考虑从应用类加载器中加载。知道加载到为止

8.反射属性Field

  1. Field翻译为字段,其实就是属性/成员
  2. 复制代码
    1
    Field[] getFields()【Class】
    1. 返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。返回数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示一个数组类、一个基本类型或 void,则此方法返回长度为 0 的数组。
    2. 返回表示公共字段的 Field 对象的数组

    3. 获取所有public属性

  3. 复制代码
    1
    Field[] getDeclaredFields()【Class】
    1. 返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。 返回数组中的元素没有排序,也没有任何特定的顺序。如果该类或接口不声明任何字段,或者此 Class 对象表示一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
    2. 返回表示此类所有已声明字段的 Field 对象的数组
  4. 复制代码
    1
    String getName()【Field】
    1. 返回此 Field 对象表示的字段的名称。
  5. 复制代码
    1
    String getName()【Class】
    1. 以 String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。
  6. 复制代码
    1
    String getSimpleName()
    1. 返回源代码中给出的底层类的简称。如果底层类是匿名的则返回一个空字符串。
  7. 复制代码
    1
    Class<?> getType()【Field】
    1. 返回一个 Class 对象,它标识了此 Field 对象所表示字段的声明类型。
  8. 复制代码
    1
    int getModifiers()【Field】
    1. 以整数形式返回由此 Field 对象表示的字段的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。
  9. 复制代码
    1
    static String toString(int mod)【Modifier】
    1. 返回描述指定修饰符中的访问修饰符标志的字符串。
  10. 复制代码
    1
    Field getDeclaredField(String name)【Class】
    1. 返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。name 参数是一个 String,它指定所需字段的简称。注意,此方法不反映数组类的 length 字段。
    2. name - 字段名
  11. 复制代码
    1
    set(Object obj, Object value)【Field】
    1. 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。如果底层字段的类型为基本类型,则对新值进行自动解包。
    2. obj - 应该修改其字段的对象
    3. value - 正被修改的 obj 的字段的新值
  12. 复制代码
    1
    T newInstance()【Class】
    1. 创建此 Class 对象所表示的类的一个新实例。如同用一个带有一个空参数列表的 new 表达式实例化该类。如果该类尚未初始化,则初始化这个类。
  13. 复制代码
    1
    void setAccessible(boolean flag)
    1. 将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。

9.可变长度参数

  1. int... args就是可变长度参数
  2. 语法是:类型...(后面一定是三个点)
  3. 可变长度参数要求的个数是0~N个
  4. 可变长度参数在参数列表必须在最后一个位置上,而且可变长度参数只能有一个
  5. 可变长度参数可以当作一个数组来看待

9.Mathod

  1. 复制代码
    1
    Method[] getMethods()【Class】
    1. 返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。数组类返回从 Object 类继承的所有(公共)member 方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果此 Class 对象表示没有公共成员方法的类或接口,或者表示一个基本类型或 void,则此方法返回长度为 0 的数组。
    2. 返回表示此类中公共方法的 Method 对象的数组
  2. 复制代码
    1
    String getName()【Method】
    1. 以 String 形式返回此 Method 对象表示的方法名称。
    2. 返回底层成员的简单名称
  3. 复制代码
    1
    Type getGenericReturnType()【Method】
    1. 返回表示由此 Method 对象所表示方法的正式返回类型的 Type 对象。
  4. 复制代码
    1
    Type[] getGenericParameterTypes()【Method】
    1. 按照声明顺序返回 Type 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型的。如果底层方法不带参数,则返回长度为 0 的数组。
  5. 复制代码
    1
    Method getMethod(String name, Class<?>... parameterTypes)
    1. 返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。name 参数是一个 String,用于指定所需方法的简称。parameterTypes 参数是按声明顺序标识该方法形参类型的 Class 对象的一个数组。如果 parameterTypes 为 null,则按空数组处理。
  6. 复制代码
    1
    Object invoke(Object obj, Object... args)
    1. 对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。个别参数被自动解包,以便与基本形参相匹配,基本参数和引用参数都随需服从方法调用转换。
    2. obj - 从中调用底层方法的对象
    3. args - 用于方法调用的参数

10.Constructor

  1. 复制代码
    1
    Constructor<?>[] getDeclaredConstructors()【Class】
    1. 返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。它们是公共、保护、默认(包)访问和私有构造方法。返回数组中的元素没有排序,也没有任何特定的顺序。如果该类存在一个默认构造方法,则它包含在返回的数组中。 如果此 Class 对象表示一个接口、一个基本类型、一个数组类或 void,则此方法返回一个长度为 0 的数组。
    2. 返回表示此类所有已声明的构造方法的 Constructor 对象的数组
  2. 复制代码
    1
    int getModifiers()【Constructor】
    1. 以整数形式返回此 Constructor 对象所表示构造方法的 Java 语言修饰符。应该使用 Modifier 类对这些修饰符进行解码。
  3. 复制代码
    1
    Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)【Class】
    1. 返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。parameterTypes 参数是 Class 对象的一个数组,它按声明顺序标识构造方法的形参类型。 如果此 Class 对象表示非静态上下文中声明的内部类,则形参类型作为第一个参数包括显示封闭的实例。
  4. Class<?>[] getParameterTypes()【Constructor】
    1. 按照声明顺序返回一组 Class 对象,这些对象表示此 Constructor 对象所表示构造方法的形参类型。如果底层构造方法不带任何参数,则返回一个长度为 0 的数组。
  5. 复制代码
    1
    Class<? super T> getSuperclass()【Class】
    1. 返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。
    2. 返回对象的父类
  6. 复制代码
    1
    Class<?>[] getInterfaces()【Class】
    1. 确定此对象所表示的类或接口实现的接口。
    2. 获取String类实现的所有接口

最后

以上就是动听火龙果最近收集整理的关于java学习:反射机制的全部内容,更多相关java学习内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部