Java 反射机制

前言

  • JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制
  • Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制
  • 反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类
  • 在构建框架上有着广范的运用

以上内容来自百度百科

相关方法

  • getClasses
    得到子类(只有被public修饰的类)
  • getDeclaredClasses
    得到类声明的所有子类
  • getConstructor
    得到类的某个构造方法
  • getConstructors
    得到构造方法(只有被public修饰的)
  • getDeclaredConstructor
    得到声明的某个构造方法
  • getDeclaredConstructors
    得到所有声明的构造方法
  • getClassLoader
    得到类加载器
  • getSuperclass
    得到父类
  • newInstance
    创建一个实例
  • getCanonicalName
    得到完整类名

  • getField
    得到类的某个字段
  • getFields
    得到类的所有字段
  • getDeclaredField
    得到类声明的某个字段(变量/属性)
  • getDeclaredFields
    得到类声明的所有字段(变量/属性)
  • getType
    得到数据类型
  • set
    设置字段值
  • setInt
    设置int类型的字段值
  • setFloat
    设置float类型的字段值
  • setBoolean
    设置boolean类型的值
  • get
    得到字段值
  • getInt
    得到int类型的字段值
  • getFloat
    得到float类型的字段值
  • getBoolean
    得到boolean类型的值

  • getMethod
    得到类的某个方法
  • getMethods
    得到类的所有方法
  • getDeclaredMethod
    得到类声明的某个方法
  • getDeclaredMethods
    得到类声明的所有方法
  • getReturnType
    得到方法的返回类型

  • getName
    得到名称(方法名/类名/字段名)
  • setAccessible
    是否获取私有访问权限,默认是false
  • getModifiers
    得到修饰符,返回一个int类型的数据 ,0—表示没有修饰符,1—public,2—private,4—protected,8—static,16—final,synchronized—32,strictfp—2048
    (修饰符可能不全,欢迎大家来补充)
    组合修饰符,列如:public static final,返回1+8+16=25

使用

  • 如果想要使用反射的话,我们首先要做的事件就是获取Class对象,否则就没办法进行后面的操作了
  • 这里有三种方法,可根据需求进行选择

获取Class对象的三种方式

//方式1:
Class c1=Class.forName("包名.类名");

//方式2:
Class c2=类名.class;

//方式3:
Class c3=对象.getClass();

实例1:通过反射修改字段值(变量/属性)

  • 反射支持修改私有 属性或变量,这个我们应该会经常用到吧!实在不行我们还能用来修改别人的源码呢?对吧!
  • 代码也比较简单,具体请看代码
public class Mall
{
   private static int gold = 0;
   
   public void getCurrentGold(){
      System.out.println("当前金币数量:" + gold);
   }
}
//创建新的Mall对象
Mall mall=new Mall();
//打印出当前金币数量
mall.getCurrentGold();
//得到Mall类
Class<?> argClass=Mall.class;
//得到变量gold
Field gold=argClass.getDeclaredField("gold");
//得到私有访问权限
gold.setAccessible(true);
//修改金币数量(变量gold)
//这里也可以写成gold.set(argClass,999);
//Field对象.set(传入参数,修改后的数值);
//然后还有get方法,使用方法也差不多
//Field对象.get(传入参数);
gold.set(mall,999);
//打印出当前金币数量
mall.getCurrentGold();
  • 运行结果
当前金币数量:0
当前金币数量:999

实例2:通过反射调用类的方法

  • 我们还能通过反射去调用其他类中的一些私有方法,也能在其他类中实例化一个对象进行操作
  • 如果是调用构造方法的话也是一样,有参数的话就传入参数类型
public class Mall
{
   private void pay(int gold){
      System.out.println("已成功充值金币:"+ gold);
   }
}
//得到Mall类
Class<?>mall=Mall.class;
//得到pay方法,传入参数类型
Method pay=mall.getDeclaredMethod("pay",int.class);
//在Mall类中实例化一个对象
Object obj=mall.newInstance();
//得到私有访问权限
pay.setAccessible(true);
//调用方法
pay.invoke(obj,999);

运行结果:

已成功充值金币:999

实例3:查看类中的所有方法

  • 我们还能通过反射查看类中的一些信息,比如方法,变量,注释
  • 这里讲述一下怎么查看方法,其他的都是同理
Class mClass=String.class;
Method[]methods=mClass.getDeclaredMethods();
for(Method method:methods){
   System.out.println(method.getName());
}

本文到此结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值