反射机制

反射机制

通过反射实现,作为框架|技术的底层出现

可以不用频繁的修改源代码,增强代码的可用性,灵活性

  • Java反射机制,可以实现以下功能:

    1. 在运行时判断任意一个对象所属的类
    2. 在运行时构造任意一个类的对象
    3. 在运行时判断任意一个类所具有的成员变量和方法
    4. 在运行时调用任意一个对象的方法
    5. 生成动态代理
  • 获取Class对象的方式:

    1. 对象.getClass();

    2. 类名.class ;

    3. Class.forName(“包名+类名”); 权限命名 – 推荐

      Class cls1 = "字符串对象".getClass();
      Class cls2 = String.class;
      Class cls3 = Class.forName("java.lang.String");
      System.out.println(cls1 == cls2); // true
      System.out.println(cls1 == cls3); // true
      System.out.println(cls3); // class java.lang.String
      
      • 通过子类的Class对象获取到其父类的Class对象
      Class obj = cls1.getSuperclass();
      System.out.println(obj == Object.class); // true
      
      • 基本数据类型|包装类 的Class对象
      System.out.println(int.class);  // int
      System.out.println(Integer.class); // class java.lang.Integer
      System.out.println(int.class==Integer.class); // false
      System.out.println(int.class==Integer.TYPE); // true
      
      • Class类其他方法
      // String getName()
      System.out.println(cls1.getName()); // java.lang.String
      // String getSimpleName()
      System.out.println(cls1.getSimpleName()); // String
      // int getModifiers()
      System.out.println(Modifier.toString(cls1.getModifiers())); // public final
      
  • 反射操作构造器:

    • Constructor getConstructor(Class<?>… parameterTypes):获取指定公共构造方法

    • Constructor<?>[] getConstructors():获取所有公共的构造器

    • Constructor getDeclaredConstructor(Class<?>… parameterTypes):获取指定的构造方法

    • Constructor<?>[] getDeclaredConstructors():获取所有的构造方法

    • 通过反射创建对象:

      • Class 的 newInstance() 方法,创建对象时会调用空构造(如果没有报错)
      • 通过 Constructor 的 newInstance() 方法,创建对象的同时执行使用哪一个构造器
      public static void testConstructor(Class<?> cls) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
      	// 获取所有公共的构造方法
      	Constructor[] cons = cls.getConstructors();
      	for (Constructor constructor : cons) {
      		System.out.println(constructor);
      	}
      	Constructor[] cons2 = cls.getDeclaredConstructors();
      	for (Constructor constructor : cons2) {
      		System.out.println(constructor);
      	}
      		
      	// 创建对象
      	User user = (User)cons[0].newInstance("Sun", 24, "123asd", "games");
      	System.out.println(user);
      	// getDeclaredConstructor(Class<?>... parameterTypes)
      	Constructor con = cls.getDeclaredConstructor(String.class, int.class);
      	System.out.println(con);
      	// 放开权限
      	con.setAccessible(true);
      	User user2 = (User)con.newInstance("Cooper", 18);
          // 关闭权限
      	con.setAccessible(false);
      	System.out.println(user2);
      	// 创建对象
      	System.out.println(cls.newInstance());
      }
      
  • 反射操作属性:

    • Field getField(String name) name–>属性名:获取指定公共成员字段

    • Field[] getFields():获取所有公共成员字段

    • Field getDeclaredField(String name):获取指定已声明字段

    • Field[] getDeclaredFields():获取所有已声明字段

      public static void testField(Class<?> cls) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException {
      	User user = (User)cls.newInstance();
      	Field[] fields = cls.getDeclaredFields();
      	for (Field field : fields) {
      		System.out.println(field);
      	}
      	Field field = cls.getField("hobby");
      	// 设置值  set(Object obj, Object value)
      	field.set(user, "games");
      	// 获取值  get(Object obj)
      	System.out.println(field.get(user));
      }
      
  • 反射操作方法:

    • Method getMethod(String name, 类<?>… parameterTypes): 获取指定公共的成员方法

    • Method[] getMethods(): 获取所有公共方法

    • Method getDeclaredMethod(String name, 类<?>… parameterTypes): 获取指定声明的成员方法

    • Method[] getDeclaredMethods(): 获取所有声明的方法,但不包括继承的方法

    • 执行方法:

      • invoke(Object obj, Object… args): 对带有指定参数的指定对象调用由此 Method对象表示的底层方法
      public static void testMethod(Class<?> cls) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException {
      	User user = (User)cls.newInstance();
      	Method[] methods = cls.getDeclaredMethods();
      	for (Method method : methods) {
      		System.out.println(method);
      	}
      	Method method = cls.getDeclaredMethod("test", Integer.class);
      	method.setAccessible(true);
      	method.invoke(user, 24);
      	method.setAccessible(false);
      }
      
  • 反射操作数组:

    • static Object newInstance(Class<?> componentType, int length)

    • 创建一个具有指定的组件类型和长度的新数组

      int[] arr = (int[]) Array.newInstance(int.class, 8);
      Array.set(arr, 0, 10);
      System.out.println(Array.get(arr, 0)); // 10
      Class cls = arr.getClass();
      System.out.println(cls.isArray()); // true
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值