获取私有方法的步骤:
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();
// 报错
}
}
}
版权声明:本文为m0_53077601原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。