5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-07 04:59:26 +08:00

SQOOP-1425: Sqoop2: Improve ClassUtils to enable use of primitive types and subclasses

This commit is contained in:
Jarek Jarcec Cecho 2014-08-11 23:34:24 -07:00 committed by Abraham Elmahrek
parent b90c6a2b80
commit 68becd49d4
2 changed files with 126 additions and 90 deletions

View File

@ -95,23 +95,20 @@ public static Object instantiate(Class klass, Object ... args) {
return null; return null;
} }
Class []argumentTypes = new Class[args.length]; Constructor []constructors = klass.getConstructors();
for(int i = 0; i < args.length; i++) {
Class type = args[i].getClass();
argumentTypes[i] = type;
}
try { for (Constructor constructor : constructors) {
Constructor constructor = klass.getConstructor(argumentTypes); try {
return constructor.newInstance(args); return constructor.newInstance(args);
} catch (NoSuchMethodException e) { } catch (InvocationTargetException e) {
LOG.debug("Can't find such constructor.", e); LOG.debug("Can't instantiate object.", e);
} catch (InvocationTargetException e) { } catch (InstantiationException e) {
LOG.debug("Can't instantiate object.", e); LOG.trace("Can't instantiate object.", e);
} catch (InstantiationException e) { } catch (IllegalAccessException e) {
LOG.debug("Can't instantiate object.", e); LOG.trace("Can't instantiate object.", e);
} catch (IllegalAccessException e) { } catch (IllegalArgumentException e) {
LOG.debug("Can't instantiate object.", e); LOG.trace("Can't instantiate object.", e);
}
} }
return null; return null;

View File

@ -17,83 +17,122 @@
*/ */
package org.apache.sqoop.utils; package org.apache.sqoop.utils;
import junit.framework.TestCase; import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
/** /**
* *
*/ */
public class TestClassUtils extends TestCase { public class TestClassUtils {
// public void testLoadClass() { @Test
// assertNull(ClassUtils.loadClass("A")); public void testLoadClass() {
// assertEquals(A.class, ClassUtils.loadClass(A.class.getName())); assertNull(ClassUtils.loadClass("A"));
// } assertEquals(A.class, ClassUtils.loadClass(A.class.getName()));
// }
// public void testInstantiateNull() {
// assertNull(ClassUtils.instantiate((Class) null)); @Test
// } public void testInstantiateNull() {
// assertNull(ClassUtils.instantiate((Class) null));
// public void testInstantiate() { }
// A a = (A) ClassUtils.instantiate(A.class, "a");
// assertNotNull(a); @Test
// assertEquals(1, a.num); public void testInstantiate() {
// assertEquals("a", a.a); // Just object calls
// A a = (A) ClassUtils.instantiate(A.class, "a");
// A b = (A) ClassUtils.instantiate(A.class, "b", 3, 5); assertNotNull(a);
// assertNotNull(b); assertEquals(1, a.num);
// assertEquals(3, b.num); assertEquals("a", a.a);
// assertEquals("b", b.a);
// assertEquals(3, b.b); // Automatic wrapping primitive -> objects
// assertEquals(5, b.c); A b = (A) ClassUtils.instantiate(A.class, "b", 3, 5);
// } assertNotNull(b);
// assertEquals(3, b.num);
// public static class A { assertEquals("b", b.a);
// String a; assertEquals(3, b.b);
// int b; assertEquals(5, b.c);
// int c;
// int num; // Primitive types in the constructor definition
// Primitive p = (Primitive) ClassUtils.instantiate(Primitive.class, 1, 1.0f, true);
// public A(String a) { assertNotNull(p);
// num = 1; assertEquals(1, p.i);
// this.a = a; assertEquals(1.0f, p.f, 0.0f);
// } assertEquals(true, p.b);
// public A(String a, Integer b, Integer c) {
// this(a); // Subclasses can be used in the constructor call
// A c = (A) ClassUtils.instantiate(A.class, new Child());
// num = 3; assertNotNull(c);
// this.b = b; assertNotNull(c.p);
// this.c = c; assertEquals(Child.class, c.p.getClass());
// } }
// }
// public static class Parent {
// public void testGetEnumStrings() { }
// assertNull(ClassUtils.getEnumStrings(A.class));
// public static class Child extends Parent {
// assertEquals( }
// new String[] {"A", "B", "C"},
// ClassUtils.getEnumStrings(EnumA.class)
// ); public static class A {
// assertEquals( String a;
// new String[] {"X", "Y"}, int b;
// ClassUtils.getEnumStrings(EnumX.class) int c;
// ); int num;
// } Parent p;
//
// enum EnumX { public A(String a) {
// X, Y num = 1;
// } this.a = a;
// }
// enum EnumA { public A(String a, Integer b, Integer c) {
// A, B, C this(a);
// }
// num = 3;
// public void assertEquals(String[] expected, String[] actual) { this.b = b;
// assertEquals("Arrays do not have same length", expected.length, actual.length); this.c = c;
// }
// for(int i = 0; i < expected.length; i++) {
// assertEquals("Items on position " + i + " differs, expected " public A(Parent p) {
// + expected[i] + ", actual " + actual[i], this.p = p;
// expected[i], actual[i]); }
// } }
// }
public static class Primitive {
int i;
float f;
boolean b;
public Primitive(int i, float f, boolean b) {
this.i = i;
this.f = f;
this.b = b;
}
}
@Test
public void testGetEnumStrings() {
assertNull(ClassUtils.getEnumStrings(A.class));
assertArrayEquals(
new String[]{"A", "B", "C"},
ClassUtils.getEnumStrings(EnumA.class)
);
assertArrayEquals(
new String[]{"X", "Y"},
ClassUtils.getEnumStrings(EnumX.class)
);
}
enum EnumX {
X, Y
}
enum EnumA {
A, B, C
}
} }