import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法
*
* @author silence
*/
public class Demo1 {
public static void main(String[] args) throws Exception {
//获得字节码文件
Class<?> clazz = Class.forName("operate425.operate.operate3.User");
//通过反射获得user对象
User user = getMethod1(clazz);
//通过反射给私有的属性设置值
setField(user, clazz);
//打印私有化方法
Method getMethod = clazz.getDeclaredMethod("get");
getMethod.setAccessible(true);
getMethod.invoke(user);
}
/**
* 通过反射给私有的属性设置值
*
* @param user user
* @param clazz clazz
*/
private static void setField(User user, Class<?> clazz) throws Exception {
//获得成员变量引用并设置值
Field username = clazz.getDeclaredField("username");
//突破成员变量private 限制
username.setAccessible(true);
//获得password属性应用
Field password = clazz.getDeclaredField("password");
//突破成员变量private 限制
password.setAccessible(true);
//给成员变量设置属性值
username.set(user, "通过反射设置username值");
password.set(user, "通过反射设置password值");
//打印user对象
System.out.println(user);
}
/**
* 通过反射获得user对象
*
* @param clazz clazz
* @return User
*/
private static User getMethod1(Class<?> clazz) throws Exception {
//获得private 修饰的构造方法
Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(String.class);
//突破构造方法private限制
declaredConstructor.setAccessible(true);
//创建user对象
User user = (User) declaredConstructor.newInstance("构造方法实参");
//打印user对象
System.out.println(user);
return user;
}
}
class User {
private String username;
private String password;
private User(String name) {
System.out.println("user私有有参构造获得的形参:" + name);
System.out.println("user私有构造被调用");
}
private void get() {
System.out.println("user私有化get方法被调用");
//打印成员变量
System.out.println("user私有化get方法:" + username);
System.out.println("user私有化get方法:" + password);
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法
最新推荐文章于 2023-05-26 13:15:44 发布