原文: https://javatutorial.net/java-reflection-example

反射(这是 Java 的功能)允许执行 Java 程序检查自身(或其他代码)并操纵程序的内部属性,例如获取成员的名称并对其执行某些操作,例如删除或显示它们。

Java 反射示例 - 图1

Java 反射示例 - 图2

默认情况下,Java 中的每个对象都有getClass(),它基本上确定当前对象的类(即使在编译时未知)。

反射使您可以编写在编译时不必“识别”所有内容的程序,而可以使程序动态化,因为它们可以在运行时链接在一起。

Java 反射的简短示例

  1. import java.lang.reflect.*;
  2. public class Main {
  3. public void print() {
  4. System.out.println("print");
  5. }
  6. public static void main(String args[])
  7. {
  8. try {
  9. Class c = Class.forName("java.lang.String");
  10. Method m[] = c.getDeclaredMethods();
  11. for (int i = 0; i < m.length; i++)
  12. System.out.println(m[i].toString());
  13. } catch (Throwable e) {
  14. // manipulate e
  15. System.out.println();
  16. }
  17. }
  18. }

在这里,class.forName为我们提供了指定的类,然后,它调用getDeclaredMethods,其目的是检索在该类中定义的方法的列表。

方法m[]存储我们要在其上调用该方法的类的所有已声明方法,在这种情况下为String

尝试并在这里捕获是必需的,就好像您没有它一样,您会收到此错误:

Java 反射示例 - 图3

输出

  1. public boolean java.lang.String.equals(java.lang.Object)
  2. public java.lang.String java.lang.String.toString()
  3. public int java.lang.String.hashCode()
  4. public int java.lang.String.compareTo(java.lang.String)
  5. public int java.lang.String.compareTo(java.lang.Object)
  6. public int java.lang.String.indexOf(java.lang.String,int)
  7. public int java.lang.String.indexOf(java.lang.String)
  8. public int java.lang.String.indexOf(int,int)
  9. public int java.lang.String.indexOf(int)
  10. static int java.lang.String.indexOf(char[],int,int,char[],int,int,int)
  11. static int java.lang.String.indexOf(char[],int,int,java.lang.String,int)
  12. public static java.lang.String java.lang.String.valueOf(int)
  13. public static java.lang.String java.lang.String.valueOf(long)
  14. public static java.lang.String java.lang.String.valueOf(float)
  15. public static java.lang.String java.lang.String.valueOf(boolean)
  16. public static java.lang.String java.lang.String.valueOf(char[])
  17. public static java.lang.String java.lang.String.valueOf(char[],int,int)
  18. public static java.lang.String java.lang.String.valueOf(java.lang.Object)
  19. public static java.lang.String java.lang.String.valueOf(char)
  20. public static java.lang.String java.lang.String.valueOf(double)
  21. public char java.lang.String.charAt(int)
  22. private static void java.lang.String.checkBounds(byte[],int,int)
  23. public int java.lang.String.codePointAt(int)
  24. public int java.lang.String.codePointBefore(int)
  25. public int java.lang.String.codePointCount(int,int)
  26. public int java.lang.String.compareToIgnoreCase(java.lang.String)
  27. public java.lang.String java.lang.String.concat(java.lang.String)
  28. public boolean java.lang.String.contains(java.lang.CharSequence)
  29. public boolean java.lang.String.contentEquals(java.lang.CharSequence)
  30. public boolean java.lang.String.contentEquals(java.lang.StringBuffer)
  31. public static java.lang.String java.lang.String.copyValueOf(char[])
  32. public static java.lang.String java.lang.String.copyValueOf(char[],int,int)
  33. public boolean java.lang.String.endsWith(java.lang.String)
  34. public boolean java.lang.String.equalsIgnoreCase(java.lang.String)
  35. public static java.lang.String java.lang.String.format(java.util.Locale,java.lang.String,java.lang.Object[])
  36. public static java.lang.String java.lang.String.format(java.lang.String,java.lang.Object[])
  37. public void java.lang.String.getBytes(int,int,byte[],int)
  38. public byte[] java.lang.String.getBytes(java.nio.charset.Charset)
  39. public byte[] java.lang.String.getBytes(java.lang.String) throws java.io.UnsupportedEncodingException
  40. public byte[] java.lang.String.getBytes()
  41. public void java.lang.String.getChars(int,int,char[],int)
  42. void java.lang.String.getChars(char[],int)
  43. private int java.lang.String.indexOfSupplementary(int,int)
  44. public native java.lang.String java.lang.String.intern()
  45. public boolean java.lang.String.isEmpty()
  46. public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.CharSequence[])
  47. public static java.lang.String java.lang.String.join(java.lang.CharSequence,java.lang.Iterable)
  48. public int java.lang.String.lastIndexOf(int)
  49. public int java.lang.String.lastIndexOf(java.lang.String)
  50. static int java.lang.String.lastIndexOf(char[],int,int,java.lang.String,int)
  51. public int java.lang.String.lastIndexOf(java.lang.String,int)
  52. public int java.lang.String.lastIndexOf(int,int)
  53. static int java.lang.String.lastIndexOf(char[],int,int,char[],int,int,int)
  54. private int java.lang.String.lastIndexOfSupplementary(int,int)
  55. public int java.lang.String.length()
  56. public boolean java.lang.String.matches(java.lang.String)
  57. private boolean java.lang.String.nonSyncContentEquals(java.lang.AbstractStringBuilder)
  58. public int java.lang.String.offsetByCodePoints(int,int)
  59. public boolean java.lang.String.regionMatches(int,java.lang.String,int,int)
  60. public boolean java.lang.String.regionMatches(boolean,int,java.lang.String,int,int)
  61. public java.lang.String java.lang.String.replace(char,char)
  62. public java.lang.String java.lang.String.replace(java.lang.CharSequence,java.lang.CharSequence)
  63. public java.lang.String java.lang.String.replaceAll(java.lang.String,java.lang.String)
  64. public java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)
  65. public java.lang.String[] java.lang.String.split(java.lang.String)
  66. public java.lang.String[] java.lang.String.split(java.lang.String,int)
  67. public boolean java.lang.String.startsWith(java.lang.String,int)
  68. public boolean java.lang.String.startsWith(java.lang.String)
  69. public java.lang.CharSequence java.lang.String.subSequence(int,int)
  70. public java.lang.String java.lang.String.substring(int)
  71. public java.lang.String java.lang.String.substring(int,int)
  72. public char[] java.lang.String.toCharArray()
  73. public java.lang.String java.lang.String.toLowerCase(java.util.Locale)
  74. public java.lang.String java.lang.String.toLowerCase()
  75. public java.lang.String java.lang.String.toUpperCase()
  76. public java.lang.String java.lang.String.toUpperCase(java.util.Locale)
  77. public java.lang.String java.lang.String.trim()

从输出中可以看到,String有很多方法。

设置反射

  1. 首先,必须获得一个类对象。 获得它的最常见方法是
    1. Class class = Class.forName("java.lang.'class name, for example String'");
  1. 下一步是调用方法(例如getDeclaredMethods()getFields()等)

  2. 下一步是使用反射 API 来操纵/更改信息

另一个示例,遵循上述的步骤

  1. import java.lang.reflect.*;
  2. class Demo
  3. {
  4. private double exampleVariable;
  5. public Demo() {
  6. exampleVariable = 2.3;
  7. }
  8. public void method1() {
  9. System.out.println("The instance variable: " + exampleVariable);
  10. }
  11. public void method2(int n) {
  12. System.out.println("The number passed: " + n);
  13. }
  14. private void method3() { // private method
  15. System.out.println("Private method has been called");
  16. }
  17. }
  18. class Main
  19. {
  20. public static void main(String args[]) throws Exception
  21. {
  22. Demo classToBeTested = new Demo();
  23. // creating class object from the class using getClass()
  24. Class classObject = classToBeTested.getClass();
  25. System.out.println("Name of class: " + classObject.getName());
  26. // getting the constructor using getConstructor()
  27. Constructor constructor = classObject.getConstructor();
  28. System.out.println("Name of constructor: " + constructor.getName());
  29. // stores all the methods the class has
  30. Method[] methods = classObject.getMethods();
  31. // printing all method names
  32. for (Method method : methods)
  33. System.out.println(method.getName());
  34. }
  35. }

输出

  1. Name of class: Demo
  2. Name of constructor: Demo
  3. method1
  4. method2
  5. wait
  6. wait
  7. wait
  8. equals
  9. toString
  10. hashCode
  11. getClass
  12. notify
  13. notifyAll