0
public class JavaClass {
    public void echo() { 
        System.out.println("Echo'd from Java Class"); 
    }

    private void doSomethingElse() {
        System.out.println("Something else happening from Java Class");
    }
}

Usually in Groovy, (Java) private methods cannot be overridden. However, it seems like the public method can be overridden like below:

JavaClass pojo = new JavaClass()
pojo.metaClass.echo = {
    println "Echo overridden!"
}

pojo.metaClass.doSomethingElse = {
    println "This won't be overridden"
}
println pojo.echo
println pojo.doSomethingElse

This outputs:

Echo overridden!
Something else happening from Java Class

If it's impossible to override private methods, why are public ones allowed?

jacob
  • 398
  • 4
  • 13
  • I'm not familiar with Groovy, but if Groovy works by creating Java anonymous subclasses: In Java, all public and protected methods are [virtual](https://en.wikipedia.org/wiki/Virtual_function). – Powerlord Nov 23 '17 at 16:19
  • 1
    Unfortunately, it doesn't work like that. If groovy sees that an object is a java object, it will retrieve its metaclass from the metaClassRegistry which associate its java class with an ExpandoMetaClass. Then all java method calls are delegated to the ExpandoMetaClass. Groovy allows public methods to be 'overridden' this way, but not private ones. – jacob Nov 23 '17 at 16:31

0 Answers0