Java反射常用方法和总结(二)

本文详细介绍了如何使用Java反射操作Method和Field。内容包括:通过Class对象获取Method,包括非私有和私有方法;获取Field,包括非私有和私有变量;以及如何对Field进行赋值和取值操作。此外,还提到了反射的暴力授权技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三、操作Method成员方法类
1、通过class类对象获取对应的Method成员方法类对象
1.1 通过class类对象获取当前类内所有非私有化成员方法(包含从父类继承而来且子类可以使用的非私有化方法)

Method[] getMethods();
 //1、获取当前类内所有非私有化成员方法,包含父类继承过来的非私有化方法
        Method[] methods = cls.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }

1.2 暴力获取当前类对象所有成员方法(包含私有化)但是不包括从父类继承而来的方法。

Method[] getDeclaredMethods();
//2、获取当前类所有成员方法,但是不包含父类继承给子类的方法
        Method[] declaredMethods = cls.getDeclaredMethods();
        for (Method method : declaredMethods) {
            System.out.println(method);
        }

1.3 根据方法名称和数据类型获取对应的成员方法,可以获取父类继承的方法,但是不能获取私有化成员方法。

Method getMethod(String methodName, Class... paramterTypes);
 //3、根据指定方法名字和参数类型,获取非私有化成员方法:
        Method game1 = cls.getMethod("game");
        Method game2 = cls.getMethod("game", String.class);
        System.out.println(game1);
        System.out.println(game2);

1.4 根据指定的方法名和参数类型,暴力获取成员方法(包含私有化,不能获取父类成员方法)

Method getDeclaredMethod(String methmodName, Class... parameterTypes);

例如:

 //4、根据指定的名字和参数类型,暴力获取私有成员方法
        Method testPrivate1 = cls.getDeclaredMethod("testPrivate");
        Method testPrivate2 = cls.getDeclaredMethod("testPrivate", String.class);
        System.out.println(testPrivate1);
        System.out.println(testPrivate2);

四、操作Field成员变量类:
1、通过Class类对象获取对应类的Field成员变量类对象:
1.1 获取类内所有非私有化成员变量数组

Field[] getFields();

例:

 //1、获取类内所有的非私有化成员变量数组
        Field[] fields = cls.getFields();
        for (Field field : fields) {
            System.out.println(field);
        }

1.2 暴力获取所有的成员变量数组(包含私有化)

Field[] getDeclaredFields();

例:

 //2、获取类内所有的成员变量数组(包含私有化)
        Field[] fields1 = cls.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println(field);
        }

1.3 根据成员变量名字获取对应的变量(非私有化)

Field getField(String fieldName);

例:

 //3、根据成员变量名字获取对应的成员变量(非私有化)
        Field test = cls.getField("test");
        System.out.println(test);

1.4 根据成员变量名字,暴力获取对应变量(私有化)

Field getDeclaredField(String fieldName);

例:

//4、根据成员变量名字,暴力获取对应变量(私有化)
        Field name = cls.getDeclaredField("name");
        System.out.println(name);

2、操作Field类对象赋值取值成员变量
2.1 赋值Field类对象对应成员比那辆

void set(Object obj, Object value);

Object obj:明确当前赋值的成员变量时哪一个类对象的。
Person p = new Person();
old:p.setName(“小明”);
now:name.set(p,“小明”);

2.2 取值Field类对象对应的成员变量
Object obj 明确获取的成员变量归属于哪一个类。

Object get(Object obj);

Person p = new Person();
old: p.getName();
now: name.get§;

Object obj = cls.getConstructor().newInstance();
        System.out.println(obj);
        test.set(obj, 666);
        System.out.println(obj);
        System.out.println(test.get(obj));

五、暴力反射授权

	一般情况下,我们不能对类的私有字段进行操作,所以在处理这些字段时候,我们就要调用AccessibleObject上的setAccessible()方法来允许这种访问,由于反射类中的Field,Method和Constructor都继承AccessibleObject ,所以通过这些类来调用setAccessible()方法,可以实现对这些字段的操作。
	子类对象包括:Field Method  Constructor

在这里插入图片描述

1、通过类名调用形态工具方式,基于AccessibleObject类对象或者其子类对象数组,赋值操作权限。

public static void setAccessible(AccessibleObject[] array, boolean flah);

2、通过AccessibleObject类对象调用,单一授权。

public void setAccessible(boolean flag);
//获取特定的声明了的方法
Method judgeMethod = emClass.getDeclaredMethod("judge", new Class[]{Integer.TYPE});
 //setAccessible(boolean flag)使所有成员可以访问,访问之前设置
judgeMethod.setAccessible(true);
  
//获取所有声明的方法
Method[] allMethods = emClass.getDeclaredMethods();
//AccessibleObject.setAccessible(AccessibleObject[] array,
 boolean flag)批量给访问权限
AccessibleObject.setAccessible(allMethods, true);
  
//下面就可以通过反射访问了
judgeMethod.invoke(em, new Object[]{3});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何忧何虑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值