Use reflector to access and modify private parameter

版权声明:本文为博主原创文章,未经博主允许也可以任意转载。 https://blog.csdn.net/fudaxing/article/details/78259418

Just one important setting: fields[i].setAccessible(true);
关注微信公众号:
huyouxiao.com
回复语言名称,比如java,python,go,C, C++.有海量资源免费赠送!

package com.kado;

import java.lang.reflect.Field;

public class ReflectionUtils {
    public static Object getInstance(Class clazz, String ... args) {
        try {
            Object object = Class.forName(clazz.getName()).newInstance();
            Field[] fields = clazz.getDeclaredFields();
            for(int i=0; i<fields.length; i++) {
                fields[i].setAccessible(true);
                for(int j=0; j<args.length; j++) {
                    String nameAndValue = args[j];
                    String nameAndValuePair[] = nameAndValue.split(":");
                    if(fields[i].getName().equals(nameAndValuePair[0])) {
                        fields[i].set(object, nameAndValuePair[1]);
                        break;
                    }
                }
            }
            return object;
        } catch(ClassNotFoundException|InstantiationException|IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static void main(String args[]) {
        Object object = getInstance(User.class, "username:kado","password:123456");
        User user = (User) object;
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
    }
}

related User bean code:

package com.kado;

public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }
    public User(){}
}

more, if the bean do not have getter and setter method for its private attributes. you can use:

  1. fields[i].set(object, nameAndValuePair[1]); to set value.
  2. Object before=fields[i].get(user); to get value.
    example code:
package com.kado;

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args) throws IllegalAccessException {
	    User user = new User("kado", "123456");

	    Field[] fields = user.getClass().getDeclaredFields();
	    for(int i=0; i<fields.length; i++)
        {
            fields[i].setAccessible(true);
            Object before=fields[i].get(user);
            System.out.println("before modify:"+before);

            if(fields[i].getName().equals("username")) {

                fields[i].set(user, "Kevin");
            } else if(fields[i].getName().equals("password")) {
                fields[i].set(user, "654321");
            }
            Object after=fields[i].get(user);
            System.out.println("after modify:"+after);
        }
    }
}

I have reference yaerfeng java高级编程-使用反射强制给private字段赋值 , Thank you!

猜你喜欢

转载自blog.csdn.net/fudaxing/article/details/78259418
今日推荐