diff --git a/org.springframework.core/src/main/java/org/springframework/util/ReflectionUtils.java b/org.springframework.core/src/main/java/org/springframework/util/ReflectionUtils.java index c8218286254..fd3dc38e307 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/ReflectionUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/util/ReflectionUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -145,11 +145,11 @@ public abstract class ReflectionUtils { * (may be null to indicate any signature) * @return the Method object, or null if none found */ - public static Method findMethod(Class clazz, String name, Class[] paramTypes) { + public static Method findMethod(Class clazz, String name, Class... paramTypes) { Assert.notNull(clazz, "Class must not be null"); Assert.notNull(name, "Method name must not be null"); Class searchType = clazz; - while (!Object.class.equals(searchType) && searchType != null) { + while (searchType != null) { Method[] methods = (searchType.isInterface() ? searchType.getMethods() : searchType.getDeclaredMethods()); for (Method method : methods) { if (name.equals(method.getName()) && @@ -173,7 +173,7 @@ public abstract class ReflectionUtils { * @see #invokeMethod(java.lang.reflect.Method, Object, Object[]) */ public static Object invokeMethod(Method method, Object target) { - return invokeMethod(method, target, null); + return invokeMethod(method, target, new Object[0]); } /** @@ -186,7 +186,7 @@ public abstract class ReflectionUtils { * @param args the invocation arguments (may be null) * @return the invocation result, if any */ - public static Object invokeMethod(Method method, Object target, Object[] args) { + public static Object invokeMethod(Method method, Object target, Object... args) { try { return method.invoke(target, args); } @@ -206,7 +206,7 @@ public abstract class ReflectionUtils { * @see #invokeJdbcMethod(java.lang.reflect.Method, Object, Object[]) */ public static Object invokeJdbcMethod(Method method, Object target) throws SQLException { - return invokeJdbcMethod(method, target, null); + return invokeJdbcMethod(method, target, new Object[0]); } /** @@ -219,7 +219,7 @@ public abstract class ReflectionUtils { * @throws SQLException the JDBC API SQLException to rethrow (if any) * @see #invokeMethod(java.lang.reflect.Method, Object, Object[]) */ - public static Object invokeJdbcMethod(Method method, Object target, Object[] args) throws SQLException { + public static Object invokeJdbcMethod(Method method, Object target, Object... args) throws SQLException { try { return method.invoke(target, args); } diff --git a/org.springframework.core/src/test/java/org/springframework/util/ReflectionUtilsTests.java b/org.springframework.core/src/test/java/org/springframework/util/ReflectionUtilsTests.java index 3bc7fb9bc54..c883b2cd0df 100644 --- a/org.springframework.core/src/test/java/org/springframework/util/ReflectionUtilsTests.java +++ b/org.springframework.core/src/test/java/org/springframework/util/ReflectionUtilsTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007 the original author or authors. + * Copyright 2002-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,6 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.rmi.ConnectException; import java.rmi.RemoteException; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -31,8 +30,6 @@ import org.junit.Test; import org.springframework.beans.TestBean; /** - *

JUnit 4 based unit tests for {@link ReflectionUtils}.

- * * @author Rob Harrop * @author Juergen Hoeller * @author Sam Brannen @@ -206,7 +203,43 @@ public class ReflectionUtilsTests { assertEquals(src.getDoctor(), dest.getDoctor()); } - static class ListSavingMethodCallback implements ReflectionUtils.MethodCallback { + @Test + public void doWithProtectedMethods() { + ListSavingMethodCallback mc = new ListSavingMethodCallback(); + ReflectionUtils.doWithMethods(TestBean.class, mc, new ReflectionUtils.MethodFilter() { + public boolean matches(Method m) { + return Modifier.isProtected(m.getModifiers()); + } + }); + assertFalse(mc.getMethodNames().isEmpty()); + assertTrue("Must find protected method on Object", mc.getMethodNames().contains("clone")); + assertTrue("Must find protected method on Object", mc.getMethodNames().contains("finalize")); + assertFalse("Public, not protected", mc.getMethodNames().contains("hashCode")); + assertFalse("Public, not protected", mc.getMethodNames().contains("absquatulate")); + } + + @Test + public void duplicatesFound() { + ListSavingMethodCallback mc = new ListSavingMethodCallback(); + ReflectionUtils.doWithMethods(TestBeanSubclass.class, mc); + int absquatulateCount = 0; + for (String name : mc.getMethodNames()) { + if (name.equals("absquatulate")) { + ++absquatulateCount; + } + } + assertEquals("Found 2 absquatulates", 2, absquatulateCount); + } + + @Test + public void findMethod() throws Exception { + assertNotNull(ReflectionUtils.findMethod(B.class, "bar", String.class)); + assertNotNull(ReflectionUtils.findMethod(B.class, "foo", Integer.class)); + assertNotNull(ReflectionUtils.findMethod(B.class, "getClass")); + } + + + private static class ListSavingMethodCallback implements ReflectionUtils.MethodCallback { private List methodNames = new LinkedList(); @@ -217,30 +250,17 @@ public class ReflectionUtilsTests { this.methods.add(m); } - public List getMethodNames() { + public List getMethodNames() { return this.methodNames; } - public List getMethods() { + public List getMethods() { return this.methods; } } - public void testDoWithProtectedMethods() { - ListSavingMethodCallback mc = new ListSavingMethodCallback(); - ReflectionUtils.doWithMethods(TestBean.class, mc, new ReflectionUtils.MethodFilter() { - public boolean matches(Method m) { - return Modifier.isProtected(m.getModifiers()); - } - }); - assertFalse(mc.getMethodNames().isEmpty()); - assertTrue("Must find protected method on Object", mc.getMethodNames().contains("clone")); - assertTrue("Must find protected method on Object", mc.getMethodNames().contains("finalize")); - assertFalse("Public, not protected", mc.getMethodNames().contains("hashCode")); - assertFalse("Public, not protected", mc.getMethodNames().contains("absquatulate")); - } - public static class TestBeanSubclass extends TestBean { + private static class TestBeanSubclass extends TestBean { @Override public void absquatulate() { @@ -248,47 +268,34 @@ public class ReflectionUtilsTests { } } - public void testDuplicatesFound() { - ListSavingMethodCallback mc = new ListSavingMethodCallback(); - ReflectionUtils.doWithMethods(TestBeanSubclass.class, mc); - int absquatulateCount = 0; - for (Iterator it = mc.getMethodNames().iterator(); it.hasNext();) { - String name = (String) it.next(); - if (name.equals("absquatulate")) { - ++absquatulateCount; - } - } - assertEquals("Found 2 absquatulates", 2, absquatulateCount); - } - - public void testFindMethod() throws Exception { - assertNotNull(ReflectionUtils.findMethod(B.class, "bar", new Class[]{String.class})); - assertNotNull(ReflectionUtils.findMethod(B.class, "foo", new Class[]{Integer.class})); - } - public static class TestBeanSubclassWithPublicField extends TestBean { + private static class TestBeanSubclassWithPublicField extends TestBean { public String publicField = "foo"; } - public static class TestBeanSubclassWithNewField extends TestBean { + + private static class TestBeanSubclassWithNewField extends TestBean { private int magic; protected String prot = "foo"; } - public static class TestBeanSubclassWithFinalField extends TestBean { + + private static class TestBeanSubclassWithFinalField extends TestBean { private final String foo = "will break naive copy that doesn't exclude statics"; } + private static class A { private void foo(Integer i) throws RemoteException { } } + private static class B extends A { void bar(String s) throws IllegalArgumentException {