基于反射原理的通用工具方法编程

1.

设计一个方法,要求该方法能修改任意对象中,指定成员变量的值

package com.homework.homework0807.me;

import java.lang.reflect.Field;

/**
 * @Author jinman1012@qq.com   2020/8/7 19:28
 * @Version 1.0
 */
public class Problem1 {

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        Kinmonsss kinmonsss = new Kinmonsss();
        System.out.println(kinmonsss.getFieldName());
        setAll(kinmonsss,"fieldName","kinmonAAA");
        System.out.println(kinmonsss.getFieldName());
    }
    /**
     * @param targetObj  要修改成员变量值的目标对象
     * @param fieldName  对象中要修改的成员变量的名字
     * @param newValue   要修改成员变量值的新值
     */
    public static void setAll(Object targetObj, String fieldName, String newValue) throws NoSuchFieldException, IllegalAccessException {
        //获取目标对象所属类型的字节码文件对象
        Class objClass = targetObj.getClass();
        //通过Class对象获取指定名称的成员变量
        Field fieldNameDec = objClass.getDeclaredField(fieldName);
        //绕过jvm权限检测
        fieldNameDec.setAccessible(true);
        //在指定对象上修改指定的成员变量的值void set(Object obj, Object newValue)
        fieldNameDec.set(targetObj,newValue);
    }
}
class Kinmonsss {
    private String fieldName;
    public String getFieldName() {
        return fieldName;
    }
    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }
}


2.

完成如下方法,要求该方法能调用,指定配置文件中,指定类中指定的普通成员方法(无参方法)
假设指定类中一定有默认构造方法

package com.homework.homework0807.me;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @Author jinman1012@qq.com   2020/8/7 19:29
 * @Version 1.0
 */
public class Problem2 {
    public static void main(String[] args) throws IOException, NoSuchMethodException, ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException {
        String pathProperties = "test.properties";
        callTargetMethod(pathProperties);
    }
    /**
     * @param configFilePath  表示配置文件的路径
     */
    public static void callTargetMethod(String configFilePath) throws IOException,
     ClassNotFoundException, NoSuchMethodException, IllegalAccessException,
      InvocationTargetException, InstantiationException {
        //加载外部properties文件过程
        Properties pt = new Properties();
        FileInputStream in = new FileInputStream(configFilePath);
        pt.load(in);
        //根据key获得properties中的value
        String className = pt.getProperty("className");
        String methodName = pt.getProperty("methodName");
        //创建全类名对应的class类对象
        Class classObj = Class.forName(className);
        //利用反射,使用类对象获得该类的一个构造方法并实例化一个对象并绕过jvm权限检测
        Constructor constructor = classObj.getDeclaredConstructor();
        constructor.setAccessible(true);
        //因为我知道它是Student类,所以强转一下
        Student stu = (Student)constructor.newInstance();
        //利用反射,使用类对象获得该类指定方法名的方法并绕过jvm权限检测
        Method declaredMethod = classObj.getDeclaredMethod(methodName);
        declaredMethod.setAccessible(true);
        //通过该类实例化的一个对象调用查找到的那个方法
        declaredMethod.invoke(stu);
    }
}
class Student {
    private void study() {
        System.out.println("I like reading. ");
    }
}

·modulePath·
className = “modulePath”.Student
methodName = study

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值