@ardyc (ArhostCode)
The project is dedicated to the topic of reflection in java. A convenient wrapper is provided for interacting with objects via proxy using reflections.
When should it be applied? When an object is loaded using another ClassLoader, the reflections mechanism is used to access the classes. The project solves the difficulties of using reflection in this case.
- Go to the release page and download the latest version of the project.
- Connect it as a jar library using the capabilities of your system to automate the build of applications
Let's say we have a sample.jar with the following contents:
//JavaObject
class JavaObject {
private Listener listener;
public Listener getListener() {
return listener;
}
private JavaObject() {
listener = new Listener("sample");
}
public static JavaObject getInstance() {
return new JavaObject();
}
}
//Listener
class Listener {
public String name;
public Listener(String name) {
this.name = name;
}
public Entity createEntity(String name) {
return new Entity(this.name + name);
}
}
//Entity
class Entity {
public UUID uuid;
public String name;
public Entity(String name) {
this.name = name;
uuid = UUID.randomUUID();
}
}
To connect sample.jar we use:
public class Main {
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException {
URLClassLoader urlClassLoader = new URLClassLoader("SampleLoader", new URL[]{
new File("sample.jar").toURI().toURL()
}, Main.class.getClassLoader());
}
}
To access the classes we use:
@Wrapped
public interface JavaObjectWrapper {
@Method("getInstance")
JavaObjectWrapper getInstance();
@Method("getListener")
ListenerWrapper getListener();
}
@Wrapped
public interface ListenerWrapper {
@Method("createEntity")
EntityWrapper createEntity(String name);
}
@Wrapped
public interface EntityWrapper {
@Field("name")
String getName();
@Field(value = "name", isSetter = true)
void setName(String name);
}
public class Main {
public static void main(String[] args) throws MalformedURLException, ClassNotFoundException {
URLClassLoader urlClassLoader = new URLClassLoader("sample", new URL[]{
new File("sample.jar").toURI().toURL()
}, Main.class.getClassLoader());
// Create static wrapper
JavaObjectWrapper wrapper = WrapperFactory.createWrapper(JavaObjectWrapper.class, urlClassLoader, "space.ardyc.test.JavaObject");
// Get non-static instance
JavaObjectWrapper object = wrapper.getInstance();
// Get listener object and call createEntity method
EntityWrapper entity = object.getListener().createEntity("sample");
System.out.println(entity.getName()); // enabledsamepl
//Set field param
entity.setName("none");
System.out.println(entity.getName()); //none
}
}