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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. 反射:就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
  2. * 要想使用,必须得到class文件对象,其实也就是得到Class类的对象。(所有的.class文件都是这个类的对象)
  3. * Class类:
  4. *                 成员变量        Field
  5. *                 构造方法        Constructor
  6. *                 成员方法        Method
  7. * 通过Class类获得者三个类,再通过这三个类的对象调用该类的方法
  8. * 获取class文件对象的方式:
  9.      * A:Object类的getClass()方法
  10.      * B:数据类型的静态属性class
  11.      * C:Class类中的静态方法
  12.                     public static Class forName(String className)
  13. 反射的调用方法,成员的举例
  14. package it.cast;
  15. import java.lang.reflect.Constructor;
  16. import java.lang.reflect.Field;
  17. import java.lang.reflect.Method;
  18. /*
  19. * 类加载器是专门加载类而存在的
  20. * 根类加载器    扩展类加载器    系统类加载器
  21. * 虚拟机调用根类加载器和扩展类加载器.在我们运行自己写的系统类加载器时
  22. * 反射:
  23. * */
  24. public class Demo {
  25.         /**
  26.          * @param args
  27.          */
  28.         public static void main(String[] args) throws Exception {
  29.                 // 三种方法创建类自解码文件对象
  30.                 Class<? extends Student> c2 = new Student().getClass();
  31.                 Class<?> c1 = Class.forName("it.cast.Student");
  32.                 Class<?> c = Student.class;
  33.                 System.out.println("--------------------------------------");
  34.                 // 获取该类公共的单个构造方法与多个构造方法
  35.                 Constructor<?> constructor2 = c.getConstructor();
  36.                 Constructor<?>[] constructors = c.getConstructors();
  37.                 // 获取该类所有的单个构造方法或者多个构造方法
  38.                 Constructor<?> declaredConstructor = c.getDeclaredConstructor();
  39.                 Constructor<?>[] declaredConstructors = c.getDeclaredConstructors();
  40.                 System.out.println("--------------------------------------");
  41.                 // 通过任意一个构造方法创造对象实例化
  42.                 Object newInstance = constructor2.newInstance();
  43.                 System.out.println("--------------------------------------");   
  44.                 // 获取该类的公共的多个成员变量
  45.                 Field[] fields = c.getFields();
  46.                 // 获取该类所有的成员变量
  47.                 // c.getDeclaredField(name);
  48.                 Field[] declaredFields = c.getDeclaredFields();
  49.                 // 获取单个成员变量的对象并赋值
  50.                 // 公共的变量直接赋值
  51.                 Field field = c.getField("a");
  52.                 //念法(给newInstance对象的field成员变量赋值为22)
  53.                 field.set(newInstance, 22);
  54.                 // 私有变量赋值
  55.                 Field field2 = c.getDeclaredField("name");
  56.                 field2.setAccessible(true);
  57.                 field2.set(newInstance, "张三");
  58.                 Field field3 = c.getDeclaredField("age");
  59.                 field3.setAccessible(true);
  60.                 field3.set(newInstance, 32);
  61.                
  62.                 System.out.println("--------------------------------------");
  63.                 //获取所有的方法
  64.                 Method[] methods = c.getMethods();//这个获取自己的和父类的所有方法
  65.                 Method[] methods2 = c.getDeclaredMethods();//获取自己的方法
  66.                 for (Method method : methods2) {
  67.                         System.out.println(method);
  68.                 }
  69.                 //获取单个方法并调用
  70.                 Method method = c.getMethod("setAge",int.class);
  71.                 method.setAccessible(true);
  72.                 method.invoke(newInstance, 200);
  73.                 System.out.println(newInstance);
  74.         }
  75. }
复制代码

1 个回复

正序浏览
赞赞赞赞赞赞赞,,,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马