Java 使用反射设置字段值

Java 使用反射设置字段值,java,reflection,field,Java,Reflection,Field,我正在处理一个非开源项目,我需要修改它的一个或多个类 在一个类中有以下集合: private Map<Integer, TTP> ttp = new HashMap<>(); private-Map ttp=new-HashMap(); 我需要做的就是在这里使用反射和concurrenthashmap。 我尝试了以下代码,但不起作用 Field f = ..getClass().getDeclaredField("ttp"); f.setAccessible(tru

我正在处理一个非开源项目,我需要修改它的一个或多个类

在一个类中有以下集合:

private Map<Integer, TTP> ttp = new HashMap<>(); 
private-Map ttp=new-HashMap();
我需要做的就是在这里使用反射和concurrenthashmap。 我尝试了以下代码,但不起作用

Field f = ..getClass().getDeclaredField("ttp");
f.setAccessible(true);
f.set(null, new ConcurrentHashMap<>());
字段f=…getClass().getDeclaredField(“ttp”);
f、 setAccessible(true);
f、 set(null,新的ConcurrentHashMap());
值得一读

将指定对象参数上此
字段
对象表示的字段设置为指定的新值

应该是这样的

f.set(objectOfTheClass, new ConcurrentHashMap<>());
f.set(ObjectOfClass,新的ConcurrentHashMap());
您不能在
null
对象中设置任何值,如果尝试,将导致
NullPointerException



注意:通过反射设置字段的值会带来一定的性能开销,因为必须执行各种操作,例如验证访问权限。从运行时的角度来看,效果是相同的,操作是原子的,就好像值是在类代码中直接更改的一样。

希望这是您正在尝试做的事情:

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class Test {

    private Map ttp = new HashMap(); 

    public  void test() {
        Field declaredField =  null;
        try {

            declaredField = Test.class.getDeclaredField("ttp");
            boolean accessible = declaredField.isAccessible();

            declaredField.setAccessible(true);

            ConcurrentHashMap<Object, Object> concHashMap = new ConcurrentHashMap<Object, Object>();
            concHashMap.put("key1", "value1");
            declaredField.set(this, concHashMap);
            Object value = ttp.get("key1");

            System.out.println(value);

            declaredField.setAccessible(accessible);

        } catch (NoSuchFieldException 
                | SecurityException
                | IllegalArgumentException 
                | IllegalAccessException e) {
            e.printStackTrace();
        }

    }

    public static void main(String... args) {
        Test test = new Test();
        test.test(); 
    }
}

下面的方法在对象上设置一个字段,即使该字段位于超类中

/**
 * Sets a field value on a given object
 *
 * @param targetObject the object to set the field value on
 * @param fieldName    exact name of the field
 * @param fieldValue   value to set on the field
 * @return true if the value was successfully set, false otherwise
 */
public static boolean setField(Object targetObject, String fieldName, Object fieldValue) {
    Field field;
    try {
        field = targetObject.getClass().getDeclaredField(fieldName);
    } catch (NoSuchFieldException e) {
        field = null;
    }
    Class superClass = targetObject.getClass().getSuperclass();
    while (field == null && superClass != null) {
        try {
            field = superClass.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            superClass = superClass.getSuperclass();
        }
    }
    if (field == null) {
        return false;
    }
    field.setAccessible(true);
    try {
        field.set(targetObject, fieldValue);
        return true;
    } catch (IllegalAccessException e) {
        return false;
    }
}
您可以尝试以下方法:

//Your class instance
Publication publication = new Publication();

//Get class with full path(with package name)
Class<?> c = Class.forName("com.example.publication.models.Publication");

//Get method
Method  method = c.getDeclaredMethod ("setTitle", String.class);

//set value
method.invoke (publication,  "Value to want to set here...");
static class Student {
    private int age;
    private int number;

    public Student(int age, int number) {
        this.age = age;
        this.number = number;
    }

    public Student() {
    }
}
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
    Student student1=new Student();
   // Class g=student1.getClass();
    Field[]fields=student1.getClass().getDeclaredFields();
    Field age=student1.getClass().getDeclaredField("age");
    age.setAccessible(true);
    age.setInt(student1,13);
    Field number=student1.getClass().getDeclaredField("number");
    number.setAccessible(true);
    number.setInt(student1,936);

    for (Field f:fields
         ) {
        f.setAccessible(true);

        System.out.println(f.getName()+" "+f.getInt(student1));

    }
}
//您的类实例
Publication Publication=新发布();
//获取具有完整路径(包名称)的类
c类=Class.forName(“com.example.publication.models.publication”);
//获取方法
方法Method=c.getDeclaredMethod(“setTitle”,String.class);
//设定值
调用(发布,“要在此处设置的值…”);
您可以尝试以下方法:

//Your class instance
Publication publication = new Publication();

//Get class with full path(with package name)
Class<?> c = Class.forName("com.example.publication.models.Publication");

//Get method
Method  method = c.getDeclaredMethod ("setTitle", String.class);

//set value
method.invoke (publication,  "Value to want to set here...");
static class Student {
    private int age;
    private int number;

    public Student(int age, int number) {
        this.age = age;
        this.number = number;
    }

    public Student() {
    }
}
public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
    Student student1=new Student();
   // Class g=student1.getClass();
    Field[]fields=student1.getClass().getDeclaredFields();
    Field age=student1.getClass().getDeclaredField("age");
    age.setAccessible(true);
    age.setInt(student1,13);
    Field number=student1.getClass().getDeclaredField("number");
    number.setAccessible(true);
    number.setInt(student1,936);

    for (Field f:fields
         ) {
        f.setAccessible(true);

        System.out.println(f.getName()+" "+f.getInt(student1));

    }
}

}

这是什么意思:但它不起作用?在哪个对象上调用
.getClass().getDeclaredField(“ttp”)
我正在寻找一些代码,用于将所有字段值从一个类复制到另一个类。但字段不仅仅是本机类型。有可能吗?@Krismorte“字段不仅仅是本地类型”的意思?例如?@Krismorte迟到了@#$%,但有可能——是的。听起来你在寻找一个“bean-to-bean映射器”,你可能会感兴趣的一个例子是@Visruth的意思是“HisOwnClass”而不是“int”或“Integer”等字段。