• 如何通过反射访问一个类的私有方法


    情况是这样的,博主要测试一个Java类,但是这个类的所有方法都是私有的。

    以方法readExprFromFile为例,步骤写在测试类的注释里。

    参考 调用方法 - 廖雪峰的官方网站

    被测类

    1. package net.mooctest;
    2. import java.util.HashMap;
    3. import java.util.List;
    4. import java.util.Map;
    5. import java.util.Arrays;
    6. import java.util.regex.*;
    7. import java.io.*;
    8. public final class ProblemSolver {
    9. private static void readExprFromFile(HashMap options) {
    10. StringBuilder builder = new StringBuilder();
    11. String varOrder = "";
    12. try (BufferedReader br = new BufferedReader(new FileReader(options.get("inFile")))) {
    13. varOrder = br.readLine();
    14. String line;
    15. while ((line = br.readLine()) != null) {
    16. if (!line.startsWith("//")) {
    17. if (builder.length() != 0) builder.append(" & ");
    18. builder.append(line);
    19. }
    20. }
    21. } catch (Exception e) {
    22. System.err.println("Error encountered reading file");
    23. System.err.println(e);
    24. System.exit(1);
    25. }
    26. String expr = builder.toString();
    27. options.put("expression", expr);
    28. // TODO: make this better
    29. if (!options.containsKey("order")) options.put("order", varOrder);
    30. createAndSolveBDD(options);
    31. }
    32. private static void createAndSolveBDD(HashMap options) {
    33. try {
    34. BoolExpression expr = new BoolExpression(options.get("expression"));
    35. BDD bdd = null;
    36. if (options.containsKey("order")) {
    37. String order = options.get("order");
    38. bdd = (order.equals("random")) ? BDD.ofRandomOrder(expr) : BDD.of(expr, parseOrder(order));
    39. } else {
    40. bdd = BDD.of(expr);
    41. }
    42. List vars = bdd.getVariables();
    43. double numSolutions = bdd.getNumSolutions();
    44. Map solution = (numSolutions != 0) ? bdd.anySat() : null;
    45. reportStats(options.get("expression"), vars, numSolutions, BDD.getNumNodes(), solution);
    46. if (options.containsKey("outFile")) {
    47. bdd.outputGraph(options.get("outFile"));
    48. }
    49. } catch (Exception e) {
    50. System.err.println("Error encountered while solving expression.");
    51. System.err.println(e);
    52. System.exit(1);
    53. }
    54. }
    55. private static void reportStats(String expr, List vars, double numSolutions,
    56. int numNodes, Map soln) {
    57. System.out.println("Statistics for expression: " + expr);
    58. System.out.println("- - - - - - -");
    59. System.out.print("\nVariable Ordering: ");
    60. System.out.println(vars);
    61. System.out.print("\nNumber of BDD Nodes: ");
    62. System.out.println(numNodes);
    63. System.out.print("\nNum solutions: ");
    64. System.out.println(numSolutions);
    65. if (soln != null) {
    66. System.out.print("\nSatisfying solution: ");
    67. System.out.println(soln);
    68. }
    69. }
    70. // TODO: Add option to specify variable ordering
    71. private static HashMap parseOptions(String args[]) {
    72. HashMap result = new HashMap();
    73. for (int i = 0; i < args.length; i++) {
    74. String arg = args[i];
    75. if (arg.length() > 0 && arg.charAt(0) == '-') {
    76. if (arg.equals("-file") || arg.equals("-f")) {
    77. try {
    78. result.put("inFile", args[i+1]);
    79. i++;
    80. } catch (ArrayIndexOutOfBoundsException e) {
    81. System.err.println("Expecting file name after -file flag");
    82. System.exit(1);
    83. }
    84. }
    85. if (arg.equals("-o") || arg.equals("-out")) {
    86. try {
    87. result.put("outFile", args[i+1]);
    88. i++;
    89. } catch (ArrayIndexOutOfBoundsException e) {
    90. System.err.println("Expecting file name after -out flag");
    91. System.exit(1);
    92. }
    93. }
    94. if (arg.equals("-order")) {
    95. try {
    96. result.put("order", args[i+1]);
    97. i++;
    98. } catch (ArrayIndexOutOfBoundsException e) {
    99. System.err.println("Expecting variable ordering after -order flag");
    100. System.exit(1);
    101. }
    102. }
    103. } else {
    104. // Assume this argument is a boolean expression to parse;
    105. result.put("expression", arg);
    106. }
    107. }
    108. return result;
    109. }
    110. private static List parseOrder(String orderStr) {
    111. return Arrays.asList(orderStr.split(Pattern.quote(" ")));
    112. }
    113. }

    测试类

    1. package net.mooctest;
    2. import static org.junit.Assert.*;
    3. import java.lang.reflect.InvocationTargetException;
    4. import java.lang.reflect.Method;
    5. import java.util.HashMap;
    6. import org.junit.Test;
    7. public class ProblemSolverTest {
    8. @Test
    9. public void test() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    10. //获取这个类的Class实例
    11. Class cls = ProblemSolver.class;
    12. HashMap options = new HashMap();
    13. //获取想要的方法
    14. Method m = cls.getDeclaredMethod("readExprFromFile", HashMap.class);
    15. //修改方法的可见性
    16. m.setAccessible(true);
    17. //调用方法
    18. m.invoke(null, options);
    19. }
    20. }

  • 相关阅读:
    java 数据库 查询 select
    【JX-18A/1信号继电器】
    如何评价GPT-4o?
    搭建云平台过程中的错误及解决方案1
    idea 导入项目
    冶金行业数字化供应链管理系统:平台精益化企业管理,助力产业高质量发展
    计算机基础知识33
    NLP教程(5) - 语言模型、RNN、GRU与LSTM
    count(1)、count(*) 与 count(列) 的区别?
    基于SqlSugar的开发框架循序渐进介绍(14)-- 基于Vue3+TypeScript的全局对象的注入和使用
  • 原文地址:https://blog.csdn.net/weixin_44997802/article/details/127950987