import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.lang.reflect.Field;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.function.ToIntFunction;
class Generator {
ToIntFunction
<Thread
> ft
=generateIntFieldAccessor
(Thread.
class,
"threadStatus"); }
private static <X> ToIntFunction<X> generateIntFieldAccessor(
byte[] code = Generator.generateIntReaderCode(c.getDeclaredField(name));
Class<?> unsafe = Class.forName("sun.misc.Unsafe");
Field u
= unsafe.
getDeclaredField("theUnsafe"); u.setAccessible(true);
Object theUnsafe
= u.
get(null); Class<ToIntFunction<X>> gen = (Class<ToIntFunction<X>>)
MethodHandles.publicLookup().bind(theUnsafe, "defineAnonymousClass",
MethodType.methodType(
Class.
class,
Class.
class,
byte[].
class,
Object[].
class)) .
invokeExact(c, code,
(Object[])null); return gen.getConstructor().newInstance();
}
private static final String HEAD
= "Êþº¾\0\0\0004\0\24\7\0\21\7\0\t\7\0\n\7\0\22" + "\n\0\2\0\6\f\0\13\0\f\t\0\4\0\b\f\0\23\0\20\1\0\20java/lang/Object\1\0\40"
+ "java/util/function/ToIntFunction\1\0\6<init>\1\0\3()V\1\0\4Code\1\0\n"
+ "applyAsInt\1\0\25(Ljava/lang/Object;)I\1\0\1I";
private static final String TAIL
= "\0001\0\1\0\2\0\1\0\3\0\0\0\2\0\1\0\13\0\f\0" + "\1\0\r\0\0\0\21\0\1\0\1\0\0\0\5*·\0\5±\0\0\0\0\0\21\0\16\0\17\0\1\0\r\0\0"
+ "\0\24\0\1\0\2\0\0\0\b+À\0\4´\0\7¬\0\0\0\0\0\0";
public static byte[] generateIntReaderCode
(Field f
) { @SuppressWarnings("deprecation") byte[] get() {
HEAD.getBytes(0, count = HEAD.length(), buf, 0);
String decl
= f.
getDeclaringClass().
getName().
replace('.',
'/'); dos.writeByte(1); dos.writeUTF(decl+"$"+f.getName()+"$access");
dos.writeByte(1); dos.writeUTF(decl);
dos.writeByte(1); dos.writeUTF(f.getName());
throw new UncheckedIOException(ex);
}
int dynSize = count;
byte[] result
= Arrays.
copyOf(buf, dynSize
+ TAIL.
length()); TAIL.getBytes(0, TAIL.length(), result, dynSize);
return result;
}
}.get();
}
}
aW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0U3RyZWFtOwppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZEhhbmRsZXM7CmltcG9ydCBqYXZhLmxhbmcuaW52b2tlLk1ldGhvZFR5cGU7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvSW50RnVuY3Rpb247CgpjbGFzcyBHZW5lcmF0b3IgewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CiAgICAgICAgVG9JbnRGdW5jdGlvbjxUaHJlYWQ+IGZ0PWdlbmVyYXRlSW50RmllbGRBY2Nlc3NvcihUaHJlYWQuY2xhc3MsICJ0aHJlYWRTdGF0dXMiKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZnQuYXBwbHlBc0ludChUaHJlYWQuY3VycmVudFRocmVhZCgpKSk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgPFg+IFRvSW50RnVuY3Rpb248WD4gZ2VuZXJhdGVJbnRGaWVsZEFjY2Vzc29yKAogICAgICAgIENsYXNzPD8gc3VwZXIgWD4gYywgU3RyaW5nIG5hbWUpIHRocm93cyBUaHJvd2FibGUgewoKICAgICAgICBieXRlW10gY29kZSA9IEdlbmVyYXRvci5nZW5lcmF0ZUludFJlYWRlckNvZGUoYy5nZXREZWNsYXJlZEZpZWxkKG5hbWUpKTsKICAgICAgICBDbGFzczw/PiB1bnNhZmUgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5VbnNhZmUiKTsKICAgICAgICBGaWVsZCB1ID0gdW5zYWZlLmdldERlY2xhcmVkRmllbGQoInRoZVVuc2FmZSIpOwogICAgICAgIHUuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICBPYmplY3QgdGhlVW5zYWZlID0gdS5nZXQobnVsbCk7CiAgICAgICAgQ2xhc3M8VG9JbnRGdW5jdGlvbjxYPj4gZ2VuID0gKENsYXNzPFRvSW50RnVuY3Rpb248WD4+KQogICAgICAgICAgICBNZXRob2RIYW5kbGVzLnB1YmxpY0xvb2t1cCgpLmJpbmQodGhlVW5zYWZlLCAiZGVmaW5lQW5vbnltb3VzQ2xhc3MiLAogICAgICAgICAgICAgICAgIE1ldGhvZFR5cGUubWV0aG9kVHlwZSgKICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuY2xhc3MsIENsYXNzLmNsYXNzLCBieXRlW10uY2xhc3MsIE9iamVjdFtdLmNsYXNzKSkKICAgICAgICAgICAgICAgIC5pbnZva2VFeGFjdChjLCBjb2RlLCAoT2JqZWN0W10pbnVsbCk7CiAgICAgICAgcmV0dXJuIGdlbi5nZXRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCk7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSAiw4rDvsK6wr5cMFwwXDAwMDRcMFwyNFw3XDBcMjFcN1wwXHRcN1wwXG5cN1wwXDIyIgogICAgICAgICsgIlxuXDBcMlwwXDZcZlwwXDEzXDBcZlx0XDBcNFwwXGJcZlwwXDIzXDBcMjBcMVwwXDIwamF2YS9sYW5nL09iamVjdFwxXDBcNDAiCiAgICAgICAgKyAiamF2YS91dGlsL2Z1bmN0aW9uL1RvSW50RnVuY3Rpb25cMVwwXDY8aW5pdD5cMVwwXDMoKVZcMVwwXDRDb2RlXDFcMFxuIgogICAgICAgICsgImFwcGx5QXNJbnRcMVwwXDI1KExqYXZhL2xhbmcvT2JqZWN0OylJXDFcMFwxSSI7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFJTCA9ICJcMDAwMVwwXDFcMFwyXDBcMVwwXDNcMFwwXDBcMlwwXDFcMFwxM1wwXGZcMCIKICAgICAgICArICJcMVwwXHJcMFwwXDBcMjFcMFwxXDBcMVwwXDBcMFw1KsK3XDBcNcKxXDBcMFwwXDBcMFwyMVwwXDE2XDBcMTdcMFwxXDBcclwwXDAiCiAgICAgICAgKyAiXDBcMjRcMFwxXDBcMlwwXDBcMFxiK8OAXDBcNMK0XDBcN8KsXDBcMFwwXDBcMFwwIjsKCiAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZW5lcmF0ZUludFJlYWRlckNvZGUoRmllbGQgZikgewogICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEhFQUQubGVuZ3RoKCkgKyBUQUlMLmxlbmd0aCgpICsgMTAwKSB7CiAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpIGJ5dGVbXSBnZXQoKSB7CiAgICAgICAgICAgICAgICBIRUFELmdldEJ5dGVzKDAsIGNvdW50ID0gSEVBRC5sZW5ndGgoKSwgYnVmLCAwKTsKICAgICAgICAgICAgICAgIHRyeShEYXRhT3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEYXRhT3V0cHV0U3RyZWFtKHRoaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlY2wgPSBmLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOwogICAgICAgICAgICAgICAgICAgIGRvcy53cml0ZUJ5dGUoMSk7IGRvcy53cml0ZVVURihkZWNsKyIkIitmLmdldE5hbWUoKSsiJGFjY2VzcyIpOwogICAgICAgICAgICAgICAgICAgIGRvcy53cml0ZUJ5dGUoMSk7IGRvcy53cml0ZVVURihkZWNsKTsKICAgICAgICAgICAgICAgICAgICBkb3Mud3JpdGVCeXRlKDEpOyBkb3Mud3JpdGVVVEYoZi5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSU9FeGNlcHRpb24oZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW50IGR5blNpemUgPSBjb3VudDsKICAgICAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBBcnJheXMuY29weU9mKGJ1ZiwgZHluU2l6ZSArIFRBSUwubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgVEFJTC5nZXRCeXRlcygwLCBUQUlMLmxlbmd0aCgpLCByZXN1bHQsIGR5blNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0uZ2V0KCk7CiAgICB9Cn0=