more readme

This commit is contained in:
Shautvast 2023-07-29 00:43:57 +02:00
parent 89d20eec57
commit 152c3469d9
4 changed files with 61 additions and 9 deletions

View file

@ -18,3 +18,31 @@ Now working on capabilities that mimick java.lang.reflect
* 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;
}
}
}
```

View 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;
}
}
}

View file

@ -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);

View file

@ -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