summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-04-15 23:14:20 +0000
committerRich Hickey <richhickey@gmail.com>2008-04-15 23:14:20 +0000
commit9662e453029d853738614dc5eea2faa631ad6188 (patch)
tree34b6da63723a285867dea003c5c75ea7db875855 /src
parentcdc20d4fea74cf5fbe381d8617f1370703d49f94 (diff)
removed hard call to Class.getField in InstanceFieldExpr, add Object methods to Reflector.getMethods of interface class
Diffstat (limited to 'src')
-rw-r--r--src/jvm/clojure/lang/Compiler.java6
-rw-r--r--src/jvm/clojure/lang/Reflector.java13
2 files changed, 15 insertions, 4 deletions
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 054e5479..2e9512ca 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -783,7 +783,7 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{
public InstanceFieldExpr(int line, Expr target, String fieldName) throws Exception{
this.target = target;
this.targetClass = target.hasJavaClass() ? target.getJavaClass() : null;
- this.field = targetClass != null ? targetClass.getField(fieldName) : null;
+ this.field = targetClass != null ? Reflector.getField(targetClass,fieldName,false) : null;
this.fieldName = fieldName;
this.line = line;
if(field == null && RT.booleanCast(RT.WARN_ON_REFLECTION.get()))
@@ -820,12 +820,10 @@ static class InstanceFieldExpr extends FieldExpr implements AssignableExpr{
}
public boolean hasJavaClass() throws Exception{
- return targetClass != null;
+ return field != null;
}
public Class getJavaClass() throws Exception{
- Class targetClass = target.getJavaClass();
- java.lang.reflect.Field field = targetClass.getField(fieldName);
return field.getType();
}
diff --git a/src/jvm/clojure/lang/Reflector.java b/src/jvm/clojure/lang/Reflector.java
index 35d9ab6d..cec3e243 100644
--- a/src/jvm/clojure/lang/Reflector.java
+++ b/src/jvm/clojure/lang/Reflector.java
@@ -260,6 +260,19 @@ static public List getMethods(Class c, int arity, String name, boolean getStatic
methods.add(allmethods[i]);
}
}
+ if(!getStatics && c.isInterface())
+ {
+ allmethods = Object.class.getMethods();
+ for(int i = 0; i < allmethods.length; i++)
+ {
+ if(name.equals(allmethods[i].getName())
+ && Modifier.isStatic(allmethods[i].getModifiers()) == getStatics
+ && allmethods[i].getParameterTypes().length == arity)
+ {
+ methods.add(allmethods[i]);
+ }
+ }
+ }
return methods;
}