You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by sc...@apache.org on 2016/08/02 14:06:27 UTC
svn commit: r1754932 -
/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java
Author: schor
Date: Tue Aug 2 14:06:27 2016
New Revision: 1754932
URL: http://svn.apache.org/viewvc?rev=1754932&view=rev
Log:
[UIMA-5030] add trick to get MethodHandles.lookup instance for UIMA class loader instance.
Modified:
uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java
Modified: uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java
URL: http://svn.apache.org/viewvc/uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java?rev=1754932&r1=1754931&r2=1754932&view=diff
==============================================================================
--- uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java (original)
+++ uima/uimaj/branches/experiment-v3-jcas/uimaj-core/src/main/java/org/apache/uima/internal/util/UIMAClassLoader.java Tue Aug 2 14:06:27 2016
@@ -34,6 +34,8 @@ import java.util.StringTokenizer;
* The strategy for this ClassLoader tries to load the class itself before the classloading is
* delegated to the application class loader.
*
+ * This loader supports loading a special class "MethodHandlesLookup" from org.apache.uima.cas.impl.MethodHandlesLookup
+ *
*/
public class UIMAClassLoader extends URLClassLoader {
@@ -42,11 +44,30 @@ public class UIMAClassLoader extends URL
}
}
+ public static final String MHLC = "org.apache.uima.cas.impl.MethodHandlesLookup";
+ /**
+ * This is the byte array that defines the class org.apache.uima.cas.impl.MethodHandlesLookup, obtained by
+ * converting the .class file to a hex byte string.
+ */
+ static byte[] methodHandlesLookupClass = javax.xml.bind.DatatypeConverter.parseHexBinary(
+ "CAFEBABE00000034001B07000201002C6F72672F6170616368652F75696D612F6361732F696D706C2F4D6574686F6448616E646C65734C6F"
+ + "6F6B75700700040100106A6176612F6C616E672F4F626A6563740100063C696E69743E010003282956010004436F64650A000300090C0005"
+ + "000601000F4C696E654E756D6265725461626C650100124C6F63616C5661726961626C655461626C650100047468697301002E4C6F72672F"
+ + "6170616368652F75696D612F6361732F696D706C2F4D6574686F6448616E646C65734C6F6F6B75703B0100166765744D6574686F6448616E"
+ + "646C65734C6F6F6B757001002928294C6A6176612F6C616E672F696E766F6B652F4D6574686F6448616E646C6573244C6F6F6B75703B0A00"
+ + "11001307001201001E6A6176612F6C616E672F696E766F6B652F4D6574686F6448616E646C65730C0014000F0100066C6F6F6B757001000A"
+ + "536F7572636546696C650100184D6574686F6448616E646C65734C6F6F6B75702E6A61766101000C496E6E6572436C617373657307001901"
+ + "00256A6176612F6C616E672F696E766F6B652F4D6574686F6448616E646C6573244C6F6F6B75700100064C6F6F6B75700021000100030000"
+ + "00000002000200050006000100070000002F00010001000000052AB70008B100000002000A0000000600010000001A000B0000000C000100"
+ + "000005000C000D00000009000E000F00010007000000240001000000000004B80010B000000002000A0000000600010000001D000B000000"
+ + "0200000002001500000002001600170000000A000100180011001A0019");
+
/**
* locks for loading more than 1 class at a time (on different threads)
* no more than the total number of cores, rounded up to pwr of 2
*/
final private static int nbrLocks = Misc.nextHigherPowerOf2(Runtime.getRuntime().availableProcessors());
+
// not static
final private Object[] syncLocks = new Object[nbrLocks];
@@ -185,7 +206,11 @@ public class UIMAClassLoader extends URL
if (c == null) {
try {
// try to load class
+ if (MHLC.equals(name)) {
+ c = defineClass(MHLC, methodHandlesLookupClass, 0, methodHandlesLookupClass.length);
+ } else {
c = findClass(name);
+ }
} catch (ClassNotFoundException e) {
// delegate class loading for this class-name
c = super.loadClass(name, false);