前言
- 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());
}
本文到此结束