Merged gcj-eclipse branch to trunk.

From-SVN: r120621
This commit is contained in:
Tom Tromey 2007-01-09 19:58:05 +00:00
parent c648dedbde
commit 97b8365caf
17478 changed files with 606493 additions and 100744 deletions

View file

@ -39,11 +39,13 @@ exception statement from your version. */
package sun.reflect.annotation;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.annotation.AnnotationTypeMismatchException;
import java.lang.annotation.IncompleteAnnotationException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
@ -74,6 +76,24 @@ public final class AnnotationInvocationHandler
this.memberValues = memberValues;
}
public static Annotation create(Class type, Map memberValues)
{
for (Method m : type.getDeclaredMethods())
{
String name = m.getName();
if (! memberValues.containsKey(name))
{
// FIXME: what to do about exceptions here?
memberValues.put(name, m.getDefaultValue());
}
}
AnnotationInvocationHandler handler
= new AnnotationInvocationHandler(type, memberValues);
return (Annotation) Proxy.newProxyInstance(type.getClassLoader(),
new Class[] { type },
handler);
}
/**
* Compare an instance of AnnotationInvocationHandler with another object.
* Note that the other object does not have to be an
@ -295,6 +315,38 @@ public final class AnnotationInvocationHandler
return returnType;
}
private Object arrayClone(Object obj)
{
if (obj instanceof boolean[])
return ((boolean[]) obj).clone();
if (obj instanceof byte[])
return ((byte[]) obj).clone();
if (obj instanceof char[])
return ((char[]) obj).clone();
if (obj instanceof short[])
return ((short[]) obj).clone();
if (obj instanceof int[])
return ((int[]) obj).clone();
if (obj instanceof float[])
return ((float[]) obj).clone();
if (obj instanceof long[])
return ((long[]) obj).clone();
if (obj instanceof double[])
return ((double[]) obj).clone();
if (obj instanceof Object[])
return ((Object[]) obj).clone();
return obj;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
@ -325,6 +377,10 @@ public final class AnnotationInvocationHandler
throw new AnnotationTypeMismatchException(method,
val.getClass().getName());
}
if (val.getClass().isArray())
{
val = arrayClone(val);
}
return val;
}
}