使用反射调用父类,超父类中方法

获取私有方法的步骤:


1.获取目标类
2.获取目标方法

Method method=clazz.getDeclaredMethod(name);//可以调用类中的所有方法(不包括父类中继承的方法)
Method method=clazz.getMethod(name);//可以调用类中有访问权限的方法(包括父类中继承的方法)

3.method.toGenericString()或method.toString()方法来输出方法的字符串形式

toGenericString()
返回描述此 Method 的字符串,包括类型参数。

toString()
返回描述此 Method 的字符串。

4.使用invoke()方法调用方法


案例:
1.创建一个Person类,写几个方法

package com.erp.platform.service.report.impl.mapstruct;

import lombok.Data;

/**
 * @Package com.erp.platform.common.params.sys.payrollReport.ecsReport
 * @Author guang
 * @Description 描述:
 * @Date 2023/1/31 21:06
 */
@Data
public class User extends Father{

    private String name;

    private String age;

    private SubjectEnum subject;

    private String createStamp;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}


2.使用反射调用私有方法

package com.erp.platform.common.params.sys.payrollReport.ecsReport;

import java.lang.reflect.Method;

/**
 * @Package com.erp.platform.common.params.sys.payrollReport.ecsReport
 * @Author guang
 * @Description 描述:
 * @Date 2023/1/31 21:08
 */
public class UserTest {
    public static void main(String[] args) throws Exception {
        User user = new User();
        //通过Class的静态方法forName加载Person
        Class<?> cls = user.getClass();

        //实例化对象的方法
        Object o = cls.newInstance();
        //在类的外部通过反射调用私有方法会破坏封装性如不是必要操作或设计需求,不建议这样做。
        Method setName = cls.getDeclaredMethod("setName", String.class);
        //在访问私有方法前设置访问操作(不设置直接调用会报错)
        setName.setAccessible(true);
        setName.invoke(user, "xiaoliu");
        System.out.println("====设置名字=====" + user.getName() + "=====" + user.getAge());

        Method setAge = cls.getDeclaredMethod("setAge", String.class);
        //在访问私有方法前设置访问操作(不设置直接调用会报错)
        setAge.setAccessible(true);
        setAge.invoke(user, "18");
        System.out.println("====设置年龄=====" + user.getName() + "=====" + user.getAge());
 }
}

 3.调用父类或超父类的中的方法

实体类

package com.erp.platform.service.report.impl.mapstruct;

/**
 * @Package com.erp.platform.service.report.impl.mapstruct
 * @Author guang
 * @Description 描述:
 * @Date 2023/2/6 23:38
 */
public class Father extends BaseDO{
    private String father;

    public String getFather() {
        return father;
    }

    public void setFather(String father) {
        this.father = father;
    }
}
package com.erp.platform.service.report.impl.mapstruct;

/**
 * @Package com.erp.platform.service.report.impl.mapstruct
 * @Author guang
 * @Description 描述:
 * @Date 2023/2/6 23:38
 */
public class BaseDO {
    private String base;

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }
}

使用

package com.erp.platform.service.report.impl.mapstruct;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Package com.erp.platform.service.report.impl.mapstruct
 * @Author guang
 * @Description 描述:
 * @Date 2023/2/6 23:42
 */
public class TestMethod {
    private void doMethod() {
        User user = new User();
        String methodName = "setBase";
        String param = "设置值";
        try {
            Class<?> cls = user.getClass();
            while (!Object.class.equals(cls)) {
                Method[] declaredMethods = cls.getDeclaredMethods();
                for (Method declaredMethod : declaredMethods) {
                    if (declaredMethod.getName().equals(methodName)) {
                        declaredMethod.invoke(user, param);
                        return;
                    }
                    cls = cls.getSuperclass();
                }
                //    报错,没查到此方法
            }
        } catch (IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
            //    报错
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值