You still have to follow the rules of Java bytecode, that is your class 
DumbProxy is not related by class hierarchy or interface to AnyClassOfMine, so 
you can't cast to it. You have to use def/Object type and Groovy's duck typing, 
or you need to make DumbProxy extend AnyClassOfMine or make an interface for 
them both to implement and use that.

Other options to consider include:
http://docs.groovy-lang.org/latest/html/gapi/groovy/util/Proxy.html
http://docs.groovy-lang.org/latest/html/gapi/groovy/util/ProxyGenerator.html
http://docs.groovy-lang.org/latest/html/gapi/groovy/lang/Delegate.html

Jason

-----Original Message-----
From: OC [mailto:[email protected]] 
Sent: Tuesday, March 29, 2016 12:16 PM
To: [email protected]
Subject: Proxying how to?!? (was: changing dynamically the name of classes in a 
source code)

Incidentally...

On 28. 3. 2016, at 18:10, OC <[email protected]> wrote:
> completely absurd and very anti-object-oriented) "Cannot cast object" 
> exception.

... this reminded me of a problem I so far haven't been able to find a proper 
solution for: how the heck do you proxy in Groovy?

In ObjC, I can write

===
@interface AnyClassOfMine:Beanlike
@property NSString *name;
@end
@implementation AnyClassOfMine @end

@interface DumbProxy:Beanlike
@property id server;
@end
@implementation DumbProxy
-forwardingTargetForSelector:(SEL)sel { return self.server; }
@end

id objects=@[[AnyClassOfMine new:@"name":@"Direct"],[DumbProxy 
new:@"server":[AnyClassOfMine new:@"name":@"Proxied"]]];
for (AnyClassOfMine *o in objects) NSLog(@"got %@",o.name);
===

and it works precisely as assumed, writing out

===
2016-03-29 17:57:37.501 a.out[5387:707] got Direct
2016-03-29 17:57:37.503 a.out[5387:707] got Proxied
===

(Note if interested: the Beanlike superclass is irrelevant, it just simulates 
the new Foo(bar:bax) functionality of Groovy, which ObjC does not have, by 
implementing the new:(property-name):(value) method.)

Groovy -- unlike pure Java -- is smart enough to allow me to _implement_ such a 
proxy, but for sweet world, I cannot find a way to _use_ it?

===
class AnyClassOfMine {
  def name
}

class DumbProxy {
  def server
  def propertyMissing(String name) {
    server."$name"
  }
}

def objects=[new AnyClassOfMine(name:"Direct"),new DumbProxy(server:new 
AnyClassOfMine(name:"Proxied"))]
for (AnyClassOfMine o in objects) println "got $o.name"
===

Alas, instead of working as expected, this fails with the aforementioned 
nonsensical exception:

===
got Direct
Caught: org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot 
cast object 'DumbProxy@73f43791' with class 'DumbProxy' to class 
'AnyClassOfMine'
...
===

How do you write and use a proxy in Groovy, so that it works properly?

(Note: "for (o in objects) ..." would work is this case, but would bring other 
problems, e.g., if there was a method "foo(AnyClassOfMine obj)" called as "for 
(o in objects) foo(o)", it would cause "No signature of method is applicable 
for argument types: (DumbProxy)".)

Thanks a lot,
OC

----------------------------------------------------------------------
This email message and any attachments are for the sole use of the intended 
recipient(s). Any unauthorized review, use, disclosure or distribution is 
prohibited. If you are not the intended recipient, please contact the sender by 
reply email and destroy all copies of the original message and any attachments.

Reply via email to