A hacky approach to private fields values extracting - 0% reflection, 100% running with scissors.
public class DomainObject {
private final String name;
private final int id;
public DomainObject(String name, int id) {
this.name = name;
this.id = id;
}
}
public class Example {
@Test
public void basicExample() {
ExtractorFactory factory = ExtractorFactory.newInstance(ExtractorFactory.Type.MAGIC);
Extractor<DomainObject> nameExtractor = factory.create(DomainObject.class, "name");
Extractor<DomainObject> idExtractor = factory.create(DomainObject.class, "id");
DomainObject domainObject = new DomainObject("hello world", 1);
String extractedString = nameExtractor.extract(domainObject);
Integer extractedId = idExtractor.extract(domainObject);
assertEquals("hello world", extractedString);
assertEquals(1, extractedId);
}
}
Because I can! Here are some numbers based in this test:
Benchmark (type) Mode Samples Score Error Units
benchmarkIntegerExtraction DIRECT thrpt 40 356.823 ± 3.781 ops/us
benchmarkIntegerExtraction REFLECTION thrpt 40 141.894 ± 3.747 ops/us
benchmarkIntegerExtraction MAGIC thrpt 40 356.025 ± 1.877 ops/us
benchmarkIntegerExtraction UNSAFE thrpt 40 318.227 ± 1.145 ops/us
benchmarkQueryLikeWorkload DIRECT thrpt 40 1428.623 ± 8.243 ops/s
benchmarkQueryLikeWorkload REFLECTION thrpt 40 511.562 ± 11.229 ops/s
benchmarkQueryLikeWorkload MAGIC thrpt 40 1450.806 ± 20.139 ops/s
benchmarkQueryLikeWorkload UNSAFE thrpt 40 1078.089 ± 22.838 ops/s
benchmarkStringExtraction DIRECT thrpt 40 355.263 ± 5.818 ops/us
benchmarkStringExtraction REFLECTION thrpt 40 142.848 ± 2.002 ops/us
benchmarkStringExtraction MAGIC thrpt 40 357.490 ± 2.528 ops/us
benchmarkStringExtraction UNSAFE thrpt 40 315.061 ± 5.595 ops/us
Apparently the Magic method is even faster than Unsafe.getXXX(object, offset). I was quite surprised by this finding as I expected Unsafe to be the fastest method.
- Primitive values are always boxed to objects. Support for extracting primitive types without boxing is the no. 1 item in my TODO list.
- Arrays are not supported.
- No auto-detection if the Magic is available.
- Poor test coverage.