你好,我之前已经在Java中使用过反射技术。但是如果你正在使用Java标准方式(例如注入私有字段),你需要编写大量代码来完成工作。
在Java对象中注入私有字段的最短方式是什么?是否有广泛使用且已经生产就绪的库实现了此功能?
你好,我之前已经在Java中使用过反射技术。但是如果你正在使用Java标准方式(例如注入私有字段),你需要编写大量代码来完成工作。
在Java对象中注入私有字段的最短方式是什么?是否有广泛使用且已经生产就绪的库实现了此功能?
不使用外部库,您需要:
Field
实例如下所示:
Field f1 = obj.getClass().getDeclaredField("field");
f1.setAccessible(true);
f1.set(obj, "new Value");
这里所说的“一行简述”
FieldUtils.writeField(Object target, String fieldName, Object value, boolean forceAccess)
如果您的项目使用 Apache Commons Lang,则通过反射设置值的最简单方式是使用类 'org.apache.commons.lang3.reflect.FieldUtils' 中的静态方法 'writeField'。import org.apache.commons.lang3.reflect.FieldUtils;
public class Main2 {
public static void main(String[] args) throws IllegalAccessException {
Bookstore bookstore = new Bookstore();
//Just one line to inject the field via reflection
FieldUtils.writeField(bookstore, "paymentService",new Paypal(), true);
bookstore.pay(); // Prints: Paying with: Paypal
//Just one line to inject the field via reflection
FieldUtils.writeField(bookstore, "paymentService",new Visa(), true);
bookstore.pay();// Prints Paying with: Visa
}
public static class Paypal implements PaymentService{}
public static class Visa implements PaymentService{}
public static class Bookstore {
private PaymentService paymentService;
public void pay(){
System.out.println("Paying with: "+ this.paymentService.getClass().getSimpleName());
}
}
}
您可以通过Maven Central获取该库:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
final Field field = ReflectionUtils.findField(Foo.class, "name", String.class)
ReflectionUtils.setField(field, targetObject, "theNewValue")
如果这是为了测试目的,还有ReflectionTestUtils也提供了一些方法。
您可以在文档这里中找到所有内容。
希望能对您有所帮助。
public static void changeField(Class cc, String field, String newValue) throws NoSuchFieldException, IllegalAccessException {
Field f = cc.getDeclaredField(field);
f.setAccessible(true);
f.set(cc, newValue);
f.setAccessible(false);
}
并像以下这样调用它
changeField(cc, "field", "newValue");