mirror of
https://github.com/corda/corda.git
synced 2024-12-30 17:57:02 +00:00
9411c223af
commit fabf4dd0cca19118c59c925f572a655d1d9c4092
Author: Joel Dice <joel.dice@gmail.com>
Date: Sun Jul 9 17:36:06 2017 -0600
reserve a little more stack space for worst-case lambda expressions
commit 24b95016dd6f62fa4a82312310fcb5c55cc22f93
Author: Joel Dice <joel.dice@gmail.com>
Date: Sun Jul 9 17:33:39 2017 -0600
support constructor references
commit a329416f4f37840d2a5d7976874585413cd4c6af
Author: Joel Dice <joel.dice@gmail.com>
Date: Sun Jul 9 17:11:19 2017 -0600
normalize class name in Classes.forName
This fixes a Tomcat classloading issue when using the OpenJDK class library.
commit ecafdf40baf2f3cde4835620e9af4380b1081fe7
Author: Joel Dice <joel.dice@gmail.com>
Date: Sun Jul 9 16:58:04 2017 -0600
fix some lambda bugs
commit 552dfd779baf077cc6445b4042588e4b6e34f3d2
Merge: 63dda56 aa2f25d
Author: Joel Dice <joel.dice@gmail.com>
Date: Sat Jul 8 10:57:59 2017 -0600
Merge remote-tracking branch 'corda/chrisr3-invoking-extension'
commit 63dda560f8648a793bdb609879076ab729b17e19
Merge: 3ec983d e589f10
Author: Joel Dice <joel.dice@gmail.com>
Date: Sat Jul 8 10:54:53 2017 -0600
Merge pull request #538 from dicej/master
avoid definePackage infinite recursion with OpenJDK class library
commit aa2f25da404b2fc168a672392df939b52ea250ab
Author: Chris Rankin <chris.rankin@r3.com>
Date: Mon Jul 3 17:26:41 2017 +0100
Add support for "invokevirtual" and "invokeinterface".
The "invokeinterface" support seems to be broken for lambdas that require native types to be boxed/unboxed.
commit e589f105741ea36d07bba1e300c7ed69c33a22d1
Author: Joel Dice <joel.dice@gmail.com>
Date: Sun Jul 2 19:43:36 2017 -0600
avoid definePackage infinite recursion with OpenJDK class library
commit 3ec983dd82e01b36fb96411df345a54119a68181
Merge: 6f6bdd7 78881d4
Author: Joel Dice <joel.dice@gmail.com>
Date: Tue Jun 13 09:50:49 2017 -0600
Merge pull request #534 from lwahlmeier/fileGetParentFile
fixed File.getParent when getting parent returns root
commit 78881d427cd474c14f5ce94484f5253de564074b
Author: Luke Wahlmeier <lwahlmeier@gmail.com>
Date: Tue May 30 13:42:56 2017 -0600
fixed File.getParent when getting parent returns root
commit 6f6bdd7d5c171e0c4c807d0a4f3aa676461307de
Merge: 8b694f9 b22343e
Author: Joel Dice <joel.dice@gmail.com>
Date: Mon May 22 12:58:09 2017 -0600
Merge pull request #529 from mikehearn/proguard-fixes
Some fixes to the ProGuard files
commit 8b694f961496f2d47a377254f61153b0338335fd
Merge: dfae414 61c82e1
Author: Joel Dice <joel.dice@gmail.com>
Date: Mon May 22 12:57:54 2017 -0600
Merge pull request #531 from mikehearn/fileinputstream-compat
FileInputStream has wrapped some more native methods
commit dfae414da8da57049076c16c43472cc32bdeb07c
Merge: 16dd804 d7a6f68
Author: Joel Dice <joel.dice@gmail.com>
Date: Mon May 22 12:57:38 2017 -0600
Merge pull request #532 from mikehearn/use-symlinks
Symlink OpenJDK files rather than hardlink
commit d7a6f68235b2d42c03aba36f1bb48d173adb4fa6
Author: Mike Hearn <mike@plan99.net>
Date: Sun May 14 21:42:06 2017 +0200
Symlink OpenJDK files rather than hardlink
commit 61c82e1070d857bcdc7a4f086d13836d9608da00
Author: Mike Hearn <mike@plan99.net>
Date: Sun May 14 21:40:52 2017 +0200
FileInputStream has wrapped some more native methods in recent OpenJDK releases
commit b22343eb6731f1df2631635e2fcf9d51817273fe
Author: Mike Hearn <mike@plan99.net>
Date: Sun May 14 21:38:09 2017 +0200
Some fixes to the ProGuard files
commit 16dd804f392168497fa17ab682978f938e291bfb
Merge: e2d3270 19deadd
Author: Joel Dice <joel.dice@gmail.com>
Date: Wed Mar 22 16:00:30 2017 -0600
Merge pull request #526 from MaartenR/arrays-binsearch
Added integer array binary search methods to Arrays class
commit e2d3270fe8e92203b6107b95f862ff5bd245c37a
Merge: dee99d6 545b9c8
Author: Joel Dice <joel.dice@gmail.com>
Date: Wed Mar 22 16:00:20 2017 -0600
Merge pull request #527 from MaartenR/integer-nolz
Added numberOfLeadingZeros method to Integer class
commit 545b9c8732a6ea026285b1edf976a79eb541ef2e
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Tue Mar 14 11:23:36 2017 +0100
Tested more negative numbers
commit b45bcf09535daef99ed31451ae55db8bec83164c
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Tue Mar 14 10:47:27 2017 +0100
Added unit test for numberOfLeadingZeros method of the Integer class
commit 19deadd36bbfc02a8c13e6d91963e41f5125057f
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Mon Mar 13 12:19:17 2017 +0100
Fixed mistake with end index being exclusive
commit 7271c0b7077ae3bef473e036aa0f0298a9eb0601
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Fri Mar 10 11:17:13 2017 +0100
Added numberOfLeadingZeros method to Integer class
commit 023bb69acd071348f29cd43ff954d3dcf2856c7c
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Thu Mar 9 13:43:03 2017 +0100
Added integer array binary search methods to Arrays class
commit dee99d6dd60b743a870d1a2c58183649c8a6449c
Merge: f7a651d
6c90953
Author: Joel Dice <joel.dice@gmail.com>
Date: Wed Mar 1 08:39:32 2017 -0700
Merge pull request #525 from MaartenR/master
Added functionality to HttpURLConnection for obtaining content length
commit 6c90953745be5451ac9a028639f94e3fcc43d7f3
Author: Maarten Raaphorst <raaphorst@serviceplanet.nl>
Date: Wed Mar 1 14:19:51 2017 +0100
Made http headers case insensitive
commit 2c3a82d2b387251a8932ddb6575e718c2c1785a7
Author: Maarten Raaphorst <mwraaphorst@gmail.com>
Date: Fri Feb 3 05:42:56 2017 -0800
Added functionality to HttpURLConnection for obtaining content length
347 lines
9.1 KiB
Java
347 lines
9.1 KiB
Java
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Method;
|
|
import java.lang.reflect.Modifier;
|
|
import java.lang.reflect.ParameterizedType;
|
|
import java.lang.reflect.Type;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
public class Reflection {
|
|
public static boolean booleanMethod() {
|
|
return true;
|
|
}
|
|
|
|
public static byte byteMethod() {
|
|
return 1;
|
|
}
|
|
|
|
public static char charMethod() {
|
|
return '2';
|
|
}
|
|
|
|
public static short shortMethod() {
|
|
return 3;
|
|
}
|
|
|
|
public static int intMethod() {
|
|
return 4;
|
|
}
|
|
|
|
public static float floatMethod() {
|
|
return 5.0f;
|
|
}
|
|
|
|
public static long longMethod() {
|
|
return 6;
|
|
}
|
|
|
|
public static double doubleMethod() {
|
|
return 7.0;
|
|
}
|
|
|
|
public static void expect(boolean v) {
|
|
if (! v) throw new RuntimeException();
|
|
}
|
|
|
|
private static class Hello<T> {
|
|
private class World<S> { }
|
|
}
|
|
|
|
private static void innerClasses() throws Exception {
|
|
Class c = Reflection.class;
|
|
Class[] inner = c.getDeclaredClasses();
|
|
expect(3 == inner.length);
|
|
expect(Hello.class == inner[0]
|
|
|| Hello.class == inner[1]
|
|
|| Hello.class == inner[2]);
|
|
}
|
|
|
|
private int egads;
|
|
|
|
private static void annotations() throws Exception {
|
|
Field egads = Reflection.class.getDeclaredField("egads");
|
|
expect(egads.getAnnotation(Deprecated.class) == null);
|
|
}
|
|
|
|
private Integer[] array;
|
|
|
|
private Integer integer;
|
|
|
|
public static Hello<Hello<Reflection>>.World<Hello<String>> pinky;
|
|
|
|
private static void genericType() throws Exception {
|
|
Field field = Reflection.class.getDeclaredField("egads");
|
|
expect(field.getGenericType() == Integer.TYPE);
|
|
|
|
field = Reflection.class.getField("pinky");
|
|
expect("Reflection$Hello$World".equals(field.getType().getName()));
|
|
expect(field.getGenericType() instanceof ParameterizedType);
|
|
ParameterizedType type = (ParameterizedType) field.getGenericType();
|
|
|
|
expect(type.getRawType() instanceof Class);
|
|
Class<?> clazz = (Class<?>) type.getRawType();
|
|
expect("Reflection$Hello$World".equals(clazz.getName()));
|
|
|
|
expect(type.getOwnerType() instanceof ParameterizedType);
|
|
ParameterizedType owner = (ParameterizedType) type.getOwnerType();
|
|
clazz = (Class<?>) owner.getRawType();
|
|
expect(clazz == Hello.class);
|
|
|
|
Type[] args = type.getActualTypeArguments();
|
|
expect(1 == args.length);
|
|
expect(args[0] instanceof ParameterizedType);
|
|
|
|
ParameterizedType arg = (ParameterizedType) args[0];
|
|
expect(arg.getRawType() instanceof Class);
|
|
clazz = (Class<?>) arg.getRawType();
|
|
expect("Reflection$Hello".equals(clazz.getName()));
|
|
|
|
args = arg.getActualTypeArguments();
|
|
expect(1 == args.length);
|
|
expect(args[0] == String.class);
|
|
}
|
|
|
|
public static void throwOOME() {
|
|
throw new OutOfMemoryError();
|
|
}
|
|
|
|
public static void classType() throws Exception {
|
|
// Class types
|
|
expect(!Reflection.class.isAnonymousClass());
|
|
expect(!Reflection.class.isLocalClass());
|
|
expect(!Reflection.class.isMemberClass());
|
|
|
|
expect(Reflection.Hello.class.isMemberClass());
|
|
|
|
Cloneable anonymousLocal = new Cloneable() {};
|
|
expect(anonymousLocal.getClass().isAnonymousClass());
|
|
|
|
class NamedLocal {}
|
|
expect(NamedLocal.class.isLocalClass());
|
|
}
|
|
|
|
private static class MyClassLoader extends ClassLoader {
|
|
public Package definePackage1(String name) {
|
|
return definePackage(name, null, null, null, null, null, null, null);
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
expect(new MyClassLoader().definePackage1("foo").getName().equals("foo"));
|
|
|
|
innerClasses();
|
|
annotations();
|
|
genericType();
|
|
classType();
|
|
|
|
Class system = Class.forName("java.lang.System");
|
|
Field out = system.getDeclaredField("out");
|
|
Class output = Class.forName("java.io.PrintStream");
|
|
Method println = output.getDeclaredMethod("println", String.class);
|
|
|
|
println.invoke(out.get(null), "Hello, World!");
|
|
|
|
expect((Boolean) Reflection.class.getMethod("booleanMethod").invoke(null));
|
|
|
|
expect(1 == (Byte) Reflection.class.getMethod("byteMethod").invoke(null));
|
|
|
|
expect('2' == (Character) Reflection.class.getMethod
|
|
("charMethod").invoke(null));
|
|
|
|
expect(3 == (Short) Reflection.class.getMethod
|
|
("shortMethod").invoke(null));
|
|
|
|
expect(4 == (Integer) Reflection.class.getMethod
|
|
("intMethod").invoke(null));
|
|
|
|
expect(5.0 == (Float) Reflection.class.getMethod
|
|
("floatMethod").invoke(null));
|
|
|
|
expect(6 == (Long) Reflection.class.getMethod
|
|
("longMethod").invoke(null));
|
|
|
|
expect(7.0 == (Double) Reflection.class.getMethod
|
|
("doubleMethod").invoke(null));
|
|
|
|
{ Class[][] array = new Class[][] { { Class.class } };
|
|
expect("[Ljava.lang.Class;".equals(array[0].getClass().getName()));
|
|
expect(Class[].class == array[0].getClass());
|
|
expect(array.getClass().getComponentType() == array[0].getClass());
|
|
}
|
|
|
|
{ Reflection r = new Reflection();
|
|
expect(r.egads == 0);
|
|
|
|
Reflection.class.getDeclaredField("egads").set(r, (Integer)42);
|
|
expect(((Integer)Reflection.class.getDeclaredField("egads").get(r)) == 42);
|
|
|
|
Reflection.class.getDeclaredField("egads").setInt(r, 43);
|
|
expect(Reflection.class.getDeclaredField("egads").getInt(r) == 43);
|
|
|
|
Integer[] array = new Integer[0];
|
|
Reflection.class.getDeclaredField("array").set(r, array);
|
|
expect(Reflection.class.getDeclaredField("array").get(r) == array);
|
|
|
|
try {
|
|
Reflection.class.getDeclaredField("array").set(r, new Object());
|
|
expect(false);
|
|
} catch (IllegalArgumentException e) {
|
|
// cool
|
|
}
|
|
|
|
Integer integer = 45;
|
|
Reflection.class.getDeclaredField("integer").set(r, integer);
|
|
expect(Reflection.class.getDeclaredField("integer").get(r) == integer);
|
|
|
|
try {
|
|
Reflection.class.getDeclaredField("integer").set(r, new Object());
|
|
expect(false);
|
|
} catch (IllegalArgumentException e) {
|
|
// cool
|
|
}
|
|
|
|
try {
|
|
Reflection.class.getDeclaredField("integer").set
|
|
(new Object(), integer);
|
|
expect(false);
|
|
} catch (IllegalArgumentException e) {
|
|
// cool
|
|
}
|
|
|
|
try {
|
|
Reflection.class.getDeclaredField("integer").get(new Object());
|
|
expect(false);
|
|
} catch (IllegalArgumentException e) {
|
|
// cool
|
|
}
|
|
}
|
|
|
|
try {
|
|
Foo.class.getMethod("foo").invoke(null);
|
|
expect(false);
|
|
} catch (ExceptionInInitializerError e) {
|
|
expect(e.getCause() instanceof MyException);
|
|
}
|
|
|
|
try {
|
|
Foo.class.getConstructor().newInstance();
|
|
expect(false);
|
|
} catch (NoClassDefFoundError e) {
|
|
// cool
|
|
}
|
|
|
|
try {
|
|
Foo.class.getField("foo").get(null);
|
|
expect(false);
|
|
} catch (NoClassDefFoundError e) {
|
|
// cool
|
|
}
|
|
|
|
try {
|
|
Foo.class.getField("foo").set(null, (Integer)42);
|
|
expect(false);
|
|
} catch (NoClassDefFoundError e) {
|
|
// cool
|
|
}
|
|
|
|
try {
|
|
Foo.class.getField("foo").set(null, new Object());
|
|
expect(false);
|
|
} catch (IllegalArgumentException e) {
|
|
// cool
|
|
} catch (NoClassDefFoundError e) {
|
|
// cool
|
|
}
|
|
|
|
{ Method m = Reflection.class.getMethod("throwOOME");
|
|
try {
|
|
m.invoke(null);
|
|
} catch(Throwable t) {
|
|
expect(t.getClass() == InvocationTargetException.class);
|
|
}
|
|
}
|
|
|
|
expect((Foo.class.getMethod("toString").getModifiers()
|
|
& Modifier.PUBLIC) != 0);
|
|
|
|
expect(avian.TestReflection.get(Baz.class.getField("foo"), new Baz())
|
|
.equals(42));
|
|
expect((Baz.class.getModifiers() & Modifier.PUBLIC) == 0);
|
|
|
|
expect(B.class.getDeclaredMethods().length == 0);
|
|
|
|
new Runnable() {
|
|
public void run() {
|
|
expect(getClass().getDeclaringClass() == null);
|
|
}
|
|
}.run();
|
|
|
|
expect(avian.testing.annotations.Test.class.getPackage().getName().equals
|
|
("avian.testing.annotations"));
|
|
|
|
expect(Baz.class.getField("foo").getAnnotation(Ann.class) == null);
|
|
expect(Baz.class.getField("foo").getAnnotations().length == 0);
|
|
|
|
expect(new Runnable() { public void run() { } }.getClass()
|
|
.getEnclosingClass().equals(Reflection.class));
|
|
|
|
expect(new Runnable() { public void run() { } }.getClass()
|
|
.getEnclosingMethod().equals
|
|
(Reflection.class.getMethod
|
|
("main", new Class[] { String[].class })));
|
|
|
|
Slithy.class.getMethod("tove", Gybe.class);
|
|
|
|
try {
|
|
Slithy.class.getMethod("tove", Bandersnatch.class);
|
|
expect(false);
|
|
} catch (NoSuchMethodException e) {
|
|
// cool
|
|
}
|
|
|
|
expect(C.class.getInterfaces().length == 1);
|
|
expect(C.class.getInterfaces()[0].equals(B.class));
|
|
}
|
|
|
|
protected static class Baz {
|
|
public int foo = 42;
|
|
}
|
|
}
|
|
|
|
class Bandersnatch { }
|
|
|
|
class Gybe extends Bandersnatch { }
|
|
|
|
class Slithy {
|
|
public static void tove(Gybe gybe) {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
class Foo {
|
|
static {
|
|
if (true) throw new MyException();
|
|
}
|
|
|
|
public Foo() { }
|
|
|
|
public static int foo;
|
|
|
|
public static void foo() {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
class MyException extends RuntimeException { }
|
|
|
|
interface A {
|
|
void foo();
|
|
}
|
|
|
|
interface B extends A { }
|
|
|
|
class C implements B {
|
|
public void foo() { }
|
|
}
|
|
|
|
@interface Ann { }
|