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