Java通过反射获取类调用方法

简介: Java通过反射获取类调用方法

在不同模块之间,需要使用其他模块的方法,这个时候就需要用到反射了

示例

模块一操作模块二,即模块一调用模块二中的方法

ReflectUtil.java

/**/**
* 反射工具类
*/
public class ReflectUtil {
    public static Class getClass(String name) {
        Class clazz = null;
        try {
            clazz = Class.forName(name);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return clazz;
    }
}

模块一

Gjc.java

public class Gjc{
  public static void init{
    /**
    * 反射调用无参方法
    */
    //通过ReflectUtil.getClass拿到反射类
    Class uiUtilClass = ReflectUtil.getClass("top.gjc.util.UiUtil");
    //如果为null则返回
        if (uiUtilClass == null) {
            LogUtil.e("没有找到top.gjc.util.UiUtil");
            return;
        }
        try {
          //通过Class的getDeclaredMethod方法拿到反射方法
            Method setUiMethod= uiUtilClass.getDeclaredMethod("setUi");
            //获取私有方法,否则会找不到这个方法(也有人说是取消Java语言访问检查,目的是提升反射速度 这个我没有测过)
            setUiMethod.setAccessible(true);
            //执行方法(如果该方法没有Class对象则传入null)
            setUiMethod.invoke(null);
        } catch (Exception e) {
            e.printStackTrace();
        }


    /**
    * 反射调用带参方法
    */
    //需要传入的参数
    int x = 666;
        int y = 999;
    //通过ReflectUtil.getClass拿到反射类
    Class uiUtilClassTwo = ReflectUtil.getClass("top.gjc.util.UiUtil");
    //如果为null则返回
    if (uiUtilClassTwo == null) {
      LogUtil.e("没有找到top.gjc.util.UiUtil");
      return;
    }
    try {
      //通过Class的getDeclaredMethod方法拿到反射方法(第一个参数是方法名,后续的是相对应的参数类型)
      Method dialogResultMethod = uiUtilClassTwo.getDeclaredMethod("dialogResult", int.class, int.class, Activity.class);
      //获取私有方法,否则会找不到这个方法(也有人说是取消Java语言访问检查,目的是提升反射速度 这个我没有测过)
      dialogResultMethod.setAccessible(true);
      //执行方法(多参数时(第一个参数是执行该方法的Class对象(如果没有传null即可),后面参数是执行该方法时传入的实参)
      dialogResultMethod.invoke(null, x, y, activity);
    } catch (Throwable e) {
      e.printStackTrace();
    }
    }
    
}

LogUtil类

模块二

UiUtil.java

public class UiUtil{

    public static void setUi() {
        DialogManager.setText();
    }
    
    public static void dialogResult(int x, int y, Activity activity) {
        DialogManager.dialogResult(x, y, activity);
    }

}

DialogManager.java

public class DialogManager{

  public static void setText() {
    /**
    * 具体操作
    */
    }

  public static void dialogResult(int x, int y, Activity activity) {
    /**
    * 具体操作
    */
  }
  
}
目录
相关文章
|
4天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
31 17
|
2天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
2天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
2天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
11 3
|
5天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
16 5
|
6天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
9 2
|
6天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
18 2
|
6天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
15 2
|
6天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
8 1
|
5天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
10 0
[Java]反射