more readme
This commit is contained in:
parent
89d20eec57
commit
152c3469d9
4 changed files with 61 additions and 9 deletions
30
README.md
30
README.md
|
|
@ -17,4 +17,32 @@ Now working on capabilities that mimick java.lang.reflect
|
||||||
* I do plan to substitute java.lang.reflect.Array, because of it's VERY poor performance
|
* I do plan to substitute java.lang.reflect.Array, because of it's VERY poor performance
|
||||||
* a read model for methods, fields etc
|
* a read model for methods, fields etc
|
||||||
* invocation capabilities
|
* invocation capabilities
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.github.shautvast.reflective.MetaClass;
|
||||||
|
import com.github.shautvast.reflective.Reflective;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Dummy dummy = new Dummy();
|
||||||
|
dummy.setName("foo");
|
||||||
|
MetaClass metaDummy = Reflective.getMetaClass(dummy.getClass());
|
||||||
|
|
||||||
|
metaDummy.getMethod("setName")
|
||||||
|
.ifPresent(m -> m.invoke(dummy, "bar"));
|
||||||
|
System.out.println(dummy.getName()); // prints "bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Dummy {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
28
src/main/java/com/github/shautvast/reflective/Main.java
Normal file
28
src/main/java/com/github/shautvast/reflective/Main.java
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
package com.github.shautvast.reflective;
|
||||||
|
|
||||||
|
import com.github.shautvast.reflective.MetaClass;
|
||||||
|
import com.github.shautvast.reflective.Reflective;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Dummy dummy = new Dummy();
|
||||||
|
dummy.setName("foo");
|
||||||
|
MetaClass metaDummy = Reflective.getMetaClass(dummy.getClass());
|
||||||
|
|
||||||
|
metaDummy.getMethod("setName")
|
||||||
|
.ifPresent(m -> m.invoke(dummy, "bar"));
|
||||||
|
System.out.println(dummy.getName()); // prints "bar"
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Dummy {
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,11 +5,7 @@ import org.objectweb.asm.ClassReader;
|
||||||
|
|
||||||
public class Reflective {
|
public class Reflective {
|
||||||
|
|
||||||
public static MetaClass getMetaForClass(Class<?> type){
|
public static MetaClass getMetaClass(Class<?> type) {
|
||||||
return getMetaClass(type);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static MetaClass getMetaClass(Class<?> type) {
|
|
||||||
try {
|
try {
|
||||||
ClassReader cr = Java.getClassReader(type);
|
ClassReader cr = Java.getClassReader(type);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public class ReflectiveTest {
|
||||||
@Test
|
@Test
|
||||||
void testMethods() {
|
void testMethods() {
|
||||||
Dummy dummy = new Dummy("bar");
|
Dummy dummy = new Dummy("bar");
|
||||||
MetaClass metaDummy = Reflective.getMetaForClass(dummy.getClass());
|
MetaClass metaDummy = Reflective.getMetaClass(dummy.getClass());
|
||||||
assertEquals("com.github.shautvast.reflective.ReflectiveTest$Dummy", metaDummy.getName());
|
assertEquals("com.github.shautvast.reflective.ReflectiveTest$Dummy", metaDummy.getName());
|
||||||
|
|
||||||
Iterator<MetaField> fields = metaDummy.getFields().iterator();
|
Iterator<MetaField> fields = metaDummy.getFields().iterator();
|
||||||
|
|
@ -52,7 +52,7 @@ public class ReflectiveTest {
|
||||||
@Test
|
@Test
|
||||||
void testInvokeGetter() {
|
void testInvokeGetter() {
|
||||||
Dummy dummy = new Dummy("bar");
|
Dummy dummy = new Dummy("bar");
|
||||||
MetaMethod getName = Reflective.getMetaForClass(dummy.getClass()).getMethod("getName").orElseGet(Assertions::fail);
|
MetaMethod getName = Reflective.getMetaClass(dummy.getClass()).getMethod("getName").orElseGet(Assertions::fail);
|
||||||
|
|
||||||
assertThrows(Panic.class, () -> getName.invoke("foo").unwrap());
|
assertThrows(Panic.class, () -> getName.invoke("foo").unwrap());
|
||||||
assertEquals("bar", getName.invoke(dummy).unwrap());
|
assertEquals("bar", getName.invoke(dummy).unwrap());
|
||||||
|
|
@ -61,7 +61,7 @@ public class ReflectiveTest {
|
||||||
@Test
|
@Test
|
||||||
void testInvokeSetter() {
|
void testInvokeSetter() {
|
||||||
Dummy dummy = new Dummy("bar");
|
Dummy dummy = new Dummy("bar");
|
||||||
MetaClass metaForClass = Reflective.getMetaForClass(dummy.getClass());
|
MetaClass metaForClass = Reflective.getMetaClass(dummy.getClass());
|
||||||
MetaMethod setName = metaForClass.getMethod("setName").orElseGet(Assertions::fail);
|
MetaMethod setName = metaForClass.getMethod("setName").orElseGet(Assertions::fail);
|
||||||
|
|
||||||
assertEquals("bar", dummy.getName()); // before invoke
|
assertEquals("bar", dummy.getName()); // before invoke
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue