java 反射

作者: 暴躁程序员 | 来源:发表于2022-02-15 11:26 被阅读0次

JVM为每一个class,创建了一个class实例,这个class实例包含class的所有信息
通过class实例,来获取class信息的方法就是反射

1. 获取class实例的三种方式

方法一:通过类名获取

Class cls = 类名.class

方法二:通过实例对象获取

Class cls = 实例化对象.getClass() 

方法三:通过完整类名获取

Class cls = Class.forName("完整类名");

获取父类class实例

Class cls = class实例.getSuperclass();

获取所有类实现接口的class实例(不包括继承的接口)

Class[] clss = class实例.getInterfaces();

2. 通过class实例获取class信息

  1. 获取字段的信息
获取字段实例(包含父类):Field f = class实例.getField("字段名称")
获取字段实例(不包含父类,当前类):Field f = class实例.getDeclaredField("字段名称")
获取所有字段实例(包含父类):Field f = class实例.getFields()
获取所有字段实例(不包含父类,当前类):Field f = class实例.getDeclaredFields()

根据字段实例可获取和设置当前字段的相关信息

获取字段的名称:String fName = f.getName(); 
获取字段的值:Object fValue = f.get();
设置字段的值:f.set(class实例, 设置的值);
设置非public字段的值需要调用:
f.setAccessible(true); // 修改非public字段,需要首先调用setAccessible(true)方法
获取字段的类型:String fType = f.getType(); 
获取字段的修饰符类型(int):int fModifier = f.getModifiers(); 
  1. 获取方法的信息
获取方法实例(包含父类):Method m = class实例.getMethod("方法名称",参数类型.class)
获取方法实例(不包含父类,当前类):Method m = class实例.getDeclaredMethod("方法名称",参数类型.class)
获取所有字段实例(包含父类):Method[] m = class实例.getMethods()
获取所有字段实例(不包含父类,当前类):Method[] m = class实例.getDeclaredMethods()

根据方法实例可获取当前方法的相关信息

获取方法的名称:String MName = m.getName(); 
获取方法返回值类型(结果也是一个class实例):class type = m.getReturnType
获取方法参数类型(结果也是一个class数组实例):class[] types = m.getReturnType
获取方法的修饰符类型(int):int fModifier = m.getModifiers(); 
调用实例方法(有返回值的方法):返回值类型 mr = (返回值类型) m.invoke(class实例,参数列表);
调用实例方法(无返回值的方法):m.invoke(class实例);
调用静态方法(有返回值的方法):返回值类型 mr = (返回值类型) m.invoke(null,参数列表);
调用非public方法(有返回值的方法)需要调用:
m.setAccessible(true); // 修改非public方法,需要首先调用setAccessible(true)方法

构造方法(无父类概念)

获取构造方法(public修饰):Constructor c1 = m.getConstructor(参数类型.class);
获取构造方法(任意):Constructor c1 = m.getDeclaredConstructor(参数类型.class);
获取所有构造方法(public修饰):Constructor[] c1s = m.getConstructors();
获取所有构造方法(任意):Constructor[] c1s = m.getDeclaredConstructors();
调用构造方法:返回值类型 cr1 = (返回值类型) c1.newInstance(参数列表);

3. 反射创建对象

拓展:常规创建对象和使用反射创建对象

  1. 常规创建对象,使用new关键词创建一个新对象
    特点:new: 强类型(不好回收)。相对高效。能调用任何public构造。
类名 实例化对象名称 = new 类名(参数列表);
  1. 反射创建对象,使用newInstance()方法创建(类的加载机制:必须加载过且已连接)(常用于工厂模式)
    特点:newInstance: 弱类型(好回收)。低效率。只能调用无参构造。
class c = Class.forName("Example");
factory = (ExampleInterface)c.newInstance();

相关文章

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

  • 一探究竟:Java反射效率低的原因到底在哪?

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • 面试官说:大家都说 Java 反射效率低,你知道原因在哪里么

    预备知识 了解 Java 反射基本用法 看完本文可以达到什么程度 了解 Java 反射原理及 Java 反射效率低...

  • Java面试题之JavaSE高级

    一、Java中的反射 1.说说你对Java中反射的理解 java中的反射首先是能够获取到Java...

网友评论

    本文标题:java 反射

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