一、User类
package com.wsw.demo7;
public class User {
private String name;
private Integer id;
private User() {}
private User(String name, Integer id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "User [name=" + name + ", id=" + id + "]";
}
private String show(String name) {
System.out.println(name);
return "Hello World!";
}
}
二、测试类
(1)暴力反射无参构造
package com.wsw.demo7;
import java.lang.reflect.Constructor;
public class TestReUser {
public static void main(String[] args) throws Exception {
//1. 获得User.class ----有三种方法,这里就不提了,推荐下面这种
Class clazz = Class.forName("com.wsw.demo7.User");
//2. 暴力获得构造方法
//getDeclared...等方法用来暴力获取私有属性的方法、字段等
Constructor construtor = clazz.getDeclaredConstructor();//获得无参构造方法
//2.1 暴力访问
construtor.setAccessible(true);
//3 实例化对象
Object user = construtor.newInstance();
System.out.println(user);
/**
* 打印结果:
* User [name=null, id=null]
*/
}
}
(2)暴力反射有参构造
package com.wsw.demo7;
import java.lang.reflect.Constructor;
public class TestReUser {
public static void main(String[] args) throws Exception {
//1. 获得User.class
Class clazz = Class.forName("com.wsw.demo7.User");
//2. 暴力获得构造方法
//getDeclared...等方法用来暴力获取私有属性的方法、字段等
Constructor construtor = clazz.getDeclaredConstructor(String.class,Integer.class);//获得有参构造方法
//2.1 暴力访问
construtor.setAccessible(true);
//3 实例化对象
Object user = construtor.newInstance("zhangsan",1001);//写入参数
System.out.println(user);
/**
* 打印结果:
* User [name=zhangsan, id=1001]
*/
}
}
(3)暴力反射私有方法
package com.wsw.demo7;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class TestReUser {
public static void main(String[] args) throws Exception {
//1 获得User.class
Class clazz = Class.forName("com.wsw.demo7.User");
//2 暴力获得构造方法 ---->因为User类构造方法是private属性,所以必须先暴力反射其构造方法才能暴力反射其他私有方法;
Constructor construtor = clazz.getDeclaredConstructor();
//2.1 暴力访问
construtor.setAccessible(true);
//3 实例化对象
Object user = construtor.newInstance();
//4 暴力获得私有方法
Method method = clazz.getDeclaredMethod("show", String.class); //如果有多个形参,则继续加","写在后面即可
//4.1 暴力访问
method.setAccessible(true);
//5 使用show方法
Object reValue = method.invoke(user, "lisi"); //执行方法并获得返回值
System.out.println(reValue);
/**
* 打印结果:
* lisi
* Hello World!
*/
}
}
4.暴力反射私有字段
package com.wsw.demo7;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReUser {
public static void main(String[] args) throws Exception {
//1 获得User.class
Class clazz = Class.forName("com.wsw.demo7.User");
//2 暴力获得构造方法
Constructor construtor = clazz.getDeclaredConstructor();
//2.1 暴力访问
construtor.setAccessible(true);
//3 实例化对象
Object user = construtor.newInstance();
//4 暴力获得name属性,id属性
Field name = clazz.getDeclaredField("name");
Field id = clazz.getDeclaredField("id");
//4.1 暴力访问
name.setAccessible(true);
id.setAccessible(true);
//5 给字段赋值
name.set(user, "wangwu");
id.set(user, 1002);
//6 获取字段值并打印
System.out.println(name.get(user)+"-----"+id.get(user));
/**
* 打印结果:
* wangwu-----1002
*/
}
}