java暴力反射私有方法(含参)和私有字段

一、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
		 */
	}
	
}

 

你可能感兴趣的:(java)