TargetObject.java
public class TargetObject {
TargetObject(){
System.out.println("我是TargetObject的value变量的值:"+value);
}
private String value = "hello";
public void publicMethod(String s,String s2) {
System.out.println("I love " + s + s2);
}
private void privateMethod() {
System.out.println("value is " + value);
}
}
main
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, NoSuchFieldException, InvocationTargetException {
/**
* 获取 TargetObject 类的 Class 对象并且创建 TargetObject 类实例
*/
// 创建一个实例,运行了一次构造方法
TargetObject originalTargetObject = new TargetObject();
// 以下为获取class的四种写法
Class<?> targetClass = Class.forName("mycode.lt.TargetObject");
targetClass = originalTargetObject.getClass();
targetClass = ClassLoader.getSystemClassLoader().loadClass("mycode.lt.TargetObject");
targetClass = TargetObject.class;
// 根据class对象创建一个实例,运行了第二次构造方法
TargetObject targetObject = (TargetObject) targetClass.newInstance();
/**
* 获取 TargetObject 类中定义的所有方法
*/
// 循环打印所有的方法名
Method[] methods = targetClass.getDeclaredMethods();
for (Method method : methods) {
System.out.println(method.getName());
}
/**
* 获取指定方法并调用
*/
// 方法名,参数类型
Method publicMethod = targetClass.getDeclaredMethod("publicMethod",
String.class, String.class);
// 实例对象,实参
publicMethod.invoke(targetObject, "Java", ", hello");
/**
* 获取指定参数并对参数进行修改
*/
// 获取value参数
Field field = targetClass.getDeclaredField("value");
// 为了对类中的参数进行修改我们取消安全检查
field.setAccessible(true);
// 修改值为123
field.set(targetObject, "123");
/**
* 调用 private 方法
*/
// 获取私有方法
Method privateMethod = targetClass.getDeclaredMethod("privateMethod");
// 为了调用private方法我们取消安全检查
privateMethod.setAccessible(true);
// 执行私有方法
privateMethod.invoke(targetObject);
}