A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /*
  2.         反射方法的总结。
  3.         看完该例子就会找到反射的规律
  4.        
  5.         例如:
  6.         1,获取某类的构造函数,想都不用想,直接就上,Constructor constructor = 字节码文件对象.getConstructor();
  7.                 这样就拿到了构造方法的Constructor对象。相对此构造方法怎么宰割,查API找方法去
  8.                
  9.         2,获取某类的方法,想都不用想,直接就上,Method method = 字节码文件对象.getMethod("方法名",参数类型.class);
  10.                 这样也拿到了方法的Method。想对此方法怎么宰割,继续查API去
  11.                
  12.         3,如果方法是私有时,Method method = 字节码文件对象.getDeclaredMethod("方法名",参数类型.class);
  13.                 然后再加上
  14.                 method.setAccessible(true);
  15.                 那么此私有的方法也获取到了,爱怎么使用再查API去。
  16. */
  17. import java.io.*;
  18. import java.lang.reflect.*;
  19. import java.net.*;
  20. import java.util.*;

  21. class Person {
  22.         public int x = 3;

  23.         private int y = 5;

  24.         public Person() {
  25.                 System.out.println("person()....run");
  26.         }

  27.         public Person(int x, int y) {
  28.                 System.out.println("Person(int x,int y).....run");
  29.         }

  30.         public void method() {
  31.                 System.out.println("method()......run");
  32.         }

  33.         public void method(String str, int num) {
  34.                 System.out.println("method(String str,int num)....run");
  35.         }

  36.         public static void staticMethod() {
  37.                 System.out.println("staticMethod().....run");
  38.         }

  39.         private void privateMethod() {
  40.                 System.out.println("privateMethod.....run");
  41.         }
  42. }

  43. public class Demo {
  44.         public static void main(String[] args) throws Exception {
  45.                 // 获取无参构造函数
  46.                 Constructor constructor1 = Class.forName("Person").getConstructor();
  47.                 Person p = (Person) constructor1.newInstance();// person()....run

  48.                 // 获取有参构造函数
  49.                 Constructor constructor2 = Class.forName("Person").getConstructor(
  50.                                 int.class, int.class);
  51.                 constructor2.newInstance(5, 6);// Person(int x,int y).....run

  52.                 // 获取 公有 的字段
  53.                 Field field1 = Class.forName("Person").getField("x");
  54.                 int x = (Integer) field1.get(p);
  55.                 System.out.println(x);// 3

  56.                 // 获取 私有 的字段 ,getDeclaredField代表能够获取Person类中私有的字段
  57.                 Field field2 = Class.forName("Person").getDeclaredField("y");
  58.                 field2.setAccessible(true);// 想要获取就必须加上这一句
  59.                 int y = (Integer) field2.get(p);
  60.                 System.out.println(y);// 5

  61.                 // 获取无参方法
  62.                 Method method1 = p.getClass().getMethod("method", null);
  63.                 method1.invoke(p, null);// method()......run

  64.                 // 获取有参方法
  65.                 Method method2 = p.getClass().getMethod("method", String.class,
  66.                                 int.class);
  67.                 method2.invoke(p, "abc", 2);// method(String str,int num)....run

  68.                 // 获取无参的静态方法
  69.                 Method method3 = p.getClass().getMethod("staticMethod", null);
  70.                 method3.invoke(p, null);// staticMethod().....run

  71.                 // 获取 私有 的方法 ,getDeclaredMethod代表能够获取Person类中的私有方法
  72.                 Method method4 = p.getClass().getDeclaredMethod("privateMethod", null);
  73.                 method4.setAccessible(true);// 如果要获取私有的,就必须加上这一句
  74.                 method4.invoke(p, null);// privateMethod.....run

  75.         }
  76. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马