jOOQ / jOOR

jOOR - Fluent Reflection in Java jOOR is a very simple fluent API that gives access to your Java Class structures in a more intuitive way. The JDK's reflection APIs are hard and verbose to use. Other languages have much simpler constructs to access type meta information at runtime. Let us make Java reflection better.
http://www.jooq.org/products
Apache License 2.0
2.81k stars 376 forks source link

Subclassing using lambdas #46

Open lukaseder opened 6 years ago

lukaseder commented 6 years ago

As originally reported by @C4Phone here: https://github.com/jOOQ/jOOL/issues/331


Hi, I just found out this library and jOOR. I really like your projects. I'd like it better if you guys could achieve "subclassing" interfaces and/or abstract classes using lambdas. This would be very helpful for using Java as an interpreted language.

Expected behavior and actual behavior:

I don't know whether similar functionalities exist. But this is what I expect:

// Run this code in a jupyter notebook.
interface Counter {
  // This is an interface, but it can also be an abstract class
  void add();
  void show();
}

org.joor.Reflect myClass = lambdaSubclass(on(Counter))
  .addField("counter", Integer.class)
  .setDefaultConstructor(self -> self.set("counter", 0))
  .set("add",  self -> self.set("counter", self.get("counter") +1)),
       "show", self -> System.out.println(self.get("counter")))  // "set" is a function of variable length.
  .doneSubclass();

Counter x = myClass.create();
x.add();
x.show();
x.add();
x.show();

// Should print 1 then print 2.

Is this possible or already implemented? If not, can I request this functionality and/or help implement it? Thank you!

lukaseder commented 6 years ago

Thanks for your suggestion. Essentially, you'd like to enhance the existing proxy implementation (which simply delegates getter and setter calls to a HashMap) with the possibility of specifying constructor and method implementations on that proxy?

markzyu commented 6 years ago

Yes. But I also worry that using these reflections too much is a bad practice and a reason to use Jython or Scala instead. So maybe people won't use this feature even if we implement it.