优化掉Array.newInstance

This commit is contained in:
redkale
2023-02-02 23:16:24 +08:00
parent 6973e6b159
commit de39ac1981
12 changed files with 72 additions and 49 deletions

View File

@@ -1247,9 +1247,9 @@ public class HttpRequest extends Request<HttpContext> {
*/ */
public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) { public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
if (this.annotations == null) { if (this.annotations == null) {
return Creator.arrayFunction(annotationClass).apply(0); return Creator.newArray(annotationClass, 0);
} }
T[] news = Creator.arrayFunction(annotationClass).apply(this.annotations.length); T[] news = Creator.newArray(annotationClass, this.annotations.length);
int index = 0; int index = 0;
for (Annotation ann : this.annotations) { for (Annotation ann : this.annotations) {
if (ann.getClass() == annotationClass) { if (ann.getClass() == annotationClass) {
@@ -1257,7 +1257,7 @@ public class HttpRequest extends Request<HttpContext> {
} }
} }
if (index < 1) { if (index < 1) {
return Creator.arrayFunction(annotationClass).apply(0); return Creator.newArray(annotationClass, 0);
} }
return Arrays.copyOf(news, index); return Arrays.copyOf(news, index);
} }

View File

@@ -713,7 +713,7 @@ public final class Rest {
mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0);
mv.visitFieldInsn(GETFIELD, newDynSuperMessageFullName, en.getKey(), Type.getDescriptor(paramType)); mv.visitFieldInsn(GETFIELD, newDynSuperMessageFullName, en.getKey(), Type.getDescriptor(paramType));
if (paramType.isPrimitive()) { if (paramType.isPrimitive()) {
Class bigclaz = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(paramType, 1), 0).getClass(); Class bigclaz = TypeToken.primitiveToWrapper(paramType);
mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(paramType) + ")" + Type.getDescriptor(bigclaz), false); mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(paramType) + ")" + Type.getDescriptor(bigclaz), false);
} }
mv.visitInsn(ARETURN); mv.visitInsn(ARETURN);

View File

@@ -37,9 +37,9 @@ public interface WebSocketParam {
default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) { default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
Annotation[] annotations = getAnnotations(); Annotation[] annotations = getAnnotations();
if (annotations == null) { if (annotations == null) {
return Creator.arrayFunction(annotationClass).apply(0); return Creator.newArray(annotationClass, 0);
} }
T[] news = Creator.arrayFunction(annotationClass).apply(annotations.length); T[] news = Creator.newArray(annotationClass, annotations.length);
int index = 0; int index = 0;
for (Annotation ann : annotations) { for (Annotation ann : annotations) {
if (ann.getClass() == annotationClass) { if (ann.getClass() == annotationClass) {
@@ -47,7 +47,7 @@ public interface WebSocketParam {
} }
} }
if (index < 1) { if (index < 1) {
return Creator.arrayFunction(annotationClass).apply(0); return Creator.newArray(annotationClass, 0);
} }
return Arrays.copyOf(news, index); return Arrays.copyOf(news, index);
} }

View File

@@ -830,7 +830,7 @@ public abstract class Sncp {
} else { } else {
mv.visitVarInsn(ILOAD, insn); mv.visitVarInsn(ILOAD, insn);
} }
Class bigclaz = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance((Class) pt, 1), 0).getClass(); Class bigclaz = TypeToken.primitiveToWrapper((Class) pt);
mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor((Class) pt) + ")" + Type.getDescriptor(bigclaz), false); mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor((Class) pt) + ")" + Type.getDescriptor(bigclaz), false);
} else { } else {
mv.visitVarInsn(ALOAD, insn); mv.visitVarInsn(ALOAD, insn);
@@ -846,7 +846,7 @@ public abstract class Sncp {
mv.visitInsn(RETURN); mv.visitInsn(RETURN);
} else { } else {
Class returnclz = method.getReturnType(); Class returnclz = method.getReturnType();
Class bigPrimitiveClass = returnclz.isPrimitive() ? java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(returnclz, 1), 0).getClass() : returnclz; Class bigPrimitiveClass = returnclz.isPrimitive() ? TypeToken.primitiveToWrapper(returnclz) : returnclz;
mv.visitTypeInsn(CHECKCAST, (returnclz.isPrimitive() ? bigPrimitiveClass : returnclz).getName().replace('.', '/')); mv.visitTypeInsn(CHECKCAST, (returnclz.isPrimitive() ? bigPrimitiveClass : returnclz).getName().replace('.', '/'));
if (returnclz.isPrimitive()) { if (returnclz.isPrimitive()) {
String bigPrimitiveName = bigPrimitiveClass.getName().replace('.', '/'); String bigPrimitiveName = bigPrimitiveClass.getName().replace('.', '/');

View File

@@ -52,7 +52,7 @@ public final class SncpDynServlet extends SncpServlet {
for (Map.Entry<Uint128, Method> en : SncpOldClient.parseMethodActions(service.getClass()).entrySet()) { for (Map.Entry<Uint128, Method> en : SncpOldClient.parseMethodActions(service.getClass()).entrySet()) {
SncpServletAction action; SncpServletAction action;
try { try {
action = SncpServletAction.create(service, en.getKey(), en.getValue()); action = SncpServletAction.create(service, serviceid, en.getKey(), en.getValue());
} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new SncpException(en.getValue() + " create " + SncpServletAction.class.getSimpleName() + " error", e); throw new SncpException(en.getValue() + " create " + SncpServletAction.class.getSimpleName() + " error", e);
} }
@@ -111,12 +111,12 @@ public final class SncpDynServlet extends SncpServlet {
SncpAsyncHandler handler = null; SncpAsyncHandler handler = null;
try { try {
if (action.handlerFuncParamIndex >= 0) { if (action.handlerFuncParamIndex >= 0) {
if (action.handlerFuncParamClass == CompletionHandler.class) { if (action.handlerFuncParamType == CompletionHandler.class) {
handler = new DefaultSncpAsyncHandler(logger, action, in, out, request, response); handler = new DefaultSncpAsyncHandler(logger, action, in, out, request, response);
} else { } else {
Creator<SncpAsyncHandler> creator = action.handlerCreator; Creator<SncpAsyncHandler> creator = action.handlerCreator;
if (creator == null) { if (creator == null) {
creator = SncpAsyncHandler.Factory.createCreator(action.handlerFuncParamClass); creator = SncpAsyncHandler.Factory.createCreator(action.handlerFuncParamType);
action.handlerCreator = creator; action.handlerCreator = creator;
} }
handler = creator.create(new DefaultSncpAsyncHandler(logger, action, in, out, request, response)); handler = creator.create(new DefaultSncpAsyncHandler(logger, action, in, out, request, response));
@@ -173,9 +173,9 @@ public final class SncpDynServlet extends SncpServlet {
protected int handlerFuncParamIndex = -1; //handlerFuncParamIndex>=0表示存在CompletionHandler参数 protected int handlerFuncParamIndex = -1; //handlerFuncParamIndex>=0表示存在CompletionHandler参数
protected boolean boolReturnTypeFuture = false; // 返回结果类型是否为 CompletableFuture protected Class handlerFuncParamType; //CompletionHandler参数的类型
protected Class handlerFuncParamClass; //CompletionHandler参数的类型 protected boolean boolReturnTypeFuture = false; // 返回结果类型是否为 CompletableFuture
public abstract void action(final BsonReader in, final BsonWriter out, final SncpAsyncHandler handler) throws Throwable; public abstract void action(final BsonReader in, final BsonWriter out, final SncpAsyncHandler handler) throws Throwable;
@@ -286,13 +286,14 @@ public final class SncpDynServlet extends SncpServlet {
* </pre></blockquote> * </pre></blockquote>
* *
* @param service Service * @param service Service
* @param serviceid 类ID
* @param actionid 操作ID * @param actionid 操作ID
* @param method 方法 * @param method 方法
* *
* @return SncpServletAction * @return SncpServletAction
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static SncpServletAction create(final Service service, final Uint128 actionid, final Method method) { public static SncpServletAction create(final Service service, final Uint128 serviceid, final Uint128 actionid, final Method method) {
final Class serviceClass = service.getClass(); final Class serviceClass = service.getClass();
final String supDynName = SncpServletAction.class.getName().replace('.', '/'); final String supDynName = SncpServletAction.class.getName().replace('.', '/');
final String serviceName = serviceClass.getName().replace('.', '/'); final String serviceName = serviceClass.getName().replace('.', '/');
@@ -306,7 +307,7 @@ public final class SncpDynServlet extends SncpServlet {
final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionServlet__" + serviceClass.getName().replace('.', '_').replace('$', '_') + "__" + method.getName() + "__" + actionid; final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionServlet__" + serviceClass.getName().replace('.', '_').replace('$', '_') + "__" + method.getName() + "__" + actionid;
int handlerFuncIndex = -1; int handlerFuncIndex = -1;
Class handlerFuncClass = null; Class handlerFuncType = null;
Class<?> newClazz = null; Class<?> newClazz = null;
try { try {
Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.')); Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.'));
@@ -315,7 +316,7 @@ public final class SncpDynServlet extends SncpServlet {
for (int i = 0; i < paramClasses.length; i++) { //反序列化方法的每个参数 for (int i = 0; i < paramClasses.length; i++) { //反序列化方法的每个参数
if (CompletionHandler.class.isAssignableFrom(paramClasses[i])) { if (CompletionHandler.class.isAssignableFrom(paramClasses[i])) {
handlerFuncIndex = i; handlerFuncIndex = i;
handlerFuncClass = paramClasses[i]; handlerFuncType = paramClasses[i];
break; break;
} }
} }
@@ -370,7 +371,7 @@ public final class SncpDynServlet extends SncpServlet {
} }
Sncp.checkAsyncModifier(paramClasses[i], method); Sncp.checkAsyncModifier(paramClasses[i], method);
handlerFuncIndex = i; handlerFuncIndex = i;
handlerFuncClass = paramClasses[i]; handlerFuncType = paramClasses[i];
mv.visitVarInsn(ALOAD, 3); mv.visitVarInsn(ALOAD, 3);
mv.visitTypeInsn(CHECKCAST, paramClasses[i].getName().replace('.', '/')); mv.visitTypeInsn(CHECKCAST, paramClasses[i].getName().replace('.', '/'));
mv.visitVarInsn(ASTORE, store); mv.visitVarInsn(ASTORE, store);
@@ -422,7 +423,7 @@ public final class SncpDynServlet extends SncpServlet {
load = DLOAD; load = DLOAD;
v = 1; v = 1;
} }
Class bigPrimitiveClass = Array.get(Array.newInstance(paramClasses[i], 1), 0).getClass(); Class bigPrimitiveClass = TypeToken.primitiveToWrapper(paramClasses[i]);
String bigPrimitiveName = bigPrimitiveClass.getName().replace('.', '/'); String bigPrimitiveName = bigPrimitiveClass.getName().replace('.', '/');
try { try {
Method pm = bigPrimitiveClass.getMethod(paramClasses[i].getSimpleName() + "Value"); Method pm = bigPrimitiveClass.getMethod(paramClasses[i].getSimpleName() + "Value");
@@ -479,7 +480,7 @@ public final class SncpDynServlet extends SncpServlet {
} else { } else {
mv.visitVarInsn(ILOAD, insn); mv.visitVarInsn(ILOAD, insn);
} }
Class bigclaz = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(pt, 1), 0).getClass(); Class bigclaz = TypeToken.primitiveToWrapper(pt);
mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(pt) + ")" + Type.getDescriptor(bigclaz), false); mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(pt) + ")" + Type.getDescriptor(bigclaz), false);
} else { } else {
mv.visitVarInsn(ALOAD, insn); mv.visitVarInsn(ALOAD, insn);
@@ -500,7 +501,7 @@ public final class SncpDynServlet extends SncpServlet {
final Class returnClass = method.getReturnType(); final Class returnClass = method.getReturnType();
if (returnClass != void.class) { if (returnClass != void.class) {
if (returnClass.isPrimitive()) { if (returnClass.isPrimitive()) {
Class bigClass = Array.get(Array.newInstance(returnClass, 1), 0).getClass(); Class bigClass = TypeToken.primitiveToWrapper(returnClass);
try { try {
Method vo = bigClass.getMethod("valueOf", returnClass); Method vo = bigClass.getMethod("valueOf", returnClass);
mv.visitMethodInsn(INVOKESTATIC, bigClass.getName().replace('.', '/'), vo.getName(), Type.getMethodDescriptor(vo), false); mv.visitMethodInsn(INVOKESTATIC, bigClass.getName().replace('.', '/'), vo.getName(), Type.getMethodDescriptor(vo), false);
@@ -553,7 +554,7 @@ public final class SncpDynServlet extends SncpServlet {
} else { } else {
mv.visitVarInsn(ILOAD, insn); mv.visitVarInsn(ILOAD, insn);
} }
Class bigclaz = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(pt, 1), 0).getClass(); Class bigclaz = TypeToken.primitiveToWrapper(pt);
mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(pt) + ")" + Type.getDescriptor(bigclaz), false); mv.visitMethodInsn(INVOKESTATIC, bigclaz.getName().replace('.', '/'), "valueOf", "(" + Type.getDescriptor(pt) + ")" + Type.getDescriptor(bigclaz), false);
} else { } else {
mv.visitVarInsn(ALOAD, insn); mv.visitVarInsn(ALOAD, insn);
@@ -626,7 +627,7 @@ public final class SncpDynServlet extends SncpServlet {
System.arraycopy(originalParamTypes, 0, types, 1, originalParamTypes.length); System.arraycopy(originalParamTypes, 0, types, 1, originalParamTypes.length);
instance.paramTypes = types; instance.paramTypes = types;
instance.handlerFuncParamIndex = handlerFuncIndex; instance.handlerFuncParamIndex = handlerFuncIndex;
instance.handlerFuncParamClass = handlerFuncClass; instance.handlerFuncParamType = handlerFuncType;
instance.boolReturnTypeFuture = boolReturnTypeFuture; instance.boolReturnTypeFuture = boolReturnTypeFuture;
newClazz.getField("service").set(instance, service); newClazz.getField("service").set(instance, service);
return instance; return instance;

View File

@@ -53,7 +53,7 @@ public interface CacheSource extends Resourcable {
public Map<String, byte[]> mgetBytes(final String... keys); public Map<String, byte[]> mgetBytes(final String... keys);
default <T> T[] mgets(final Type componentType, final String... keys) { default <T> T[] mgets(final Type componentType, final String... keys) {
T[] rs = (T[]) Creator.arrayFunction(TypeToken.typeToClass(componentType)).apply(keys.length); T[] rs = (T[]) Creator.newArray(TypeToken.typeToClass(componentType), keys.length);
Map<String, T> map = mget(componentType, keys); Map<String, T> map = mget(componentType, keys);
for (int i = 0; i < keys.length; i++) { for (int i = 0; i < keys.length; i++) {
rs[i] = map.get(keys[i]); rs[i] = map.get(keys[i]);
@@ -335,7 +335,7 @@ public interface CacheSource extends Resourcable {
default <T> CompletableFuture<T[]> mgetsAsync(final Type componentType, final String... keys) { default <T> CompletableFuture<T[]> mgetsAsync(final Type componentType, final String... keys) {
return mgetAsync(componentType, keys).thenApply(map -> { return mgetAsync(componentType, keys).thenApply(map -> {
T[] rs = (T[]) Creator.arrayFunction(TypeToken.typeToClass(componentType)).apply(keys.length); T[] rs = (T[]) Creator.newArray(TypeToken.typeToClass(componentType), keys.length);
for (int i = 0; i < keys.length; i++) { for (int i = 0; i < keys.length; i++) {
rs[i] = (T) map.get(keys[i]); rs[i] = (T) map.get(keys[i]);
} }

View File

@@ -6,7 +6,6 @@
package org.redkale.source; package org.redkale.source;
import java.io.Serializable; import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.*; import java.util.concurrent.atomic.*;
@@ -834,9 +833,9 @@ public final class EntityCache<T> {
public T[] update(final T entity, final Collection<Attribute<T, Serializable>> attrs, final FilterNode node) { public T[] update(final T entity, final Collection<Attribute<T, Serializable>> attrs, final FilterNode node) {
if (entity == null || node == null) { if (entity == null || node == null) {
return (T[]) Array.newInstance(type, 0); return (T[]) Creator.newArray(type, 0);
} }
T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len)); T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(Creator.arrayFunction(type));
tableLock.lock(); //表锁, 可优化成行锁 tableLock.lock(); //表锁, 可优化成行锁
try { try {
for (T rs : rms) { for (T rs : rms) {
@@ -863,9 +862,9 @@ public final class EntityCache<T> {
public <V> T[] update(Attribute<T, V> attr, final V fieldValue, final FilterNode node) { public <V> T[] update(Attribute<T, V> attr, final V fieldValue, final FilterNode node) {
if (attr == null || node == null) { if (attr == null || node == null) {
return (T[]) Array.newInstance(type, 0); return (T[]) Creator.newArray(type, 0);
} }
T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len)); T[] rms = this.list.stream().filter(node.createPredicate(this)).toArray(Creator.arrayFunction(type));
for (T rs : rms) { for (T rs : rms) {
attr.set(rs, fieldValue); attr.set(rs, fieldValue);
} }
@@ -894,7 +893,7 @@ public final class EntityCache<T> {
public <V> T[] updateColumn(final FilterNode node, final Flipper flipper, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) { public <V> T[] updateColumn(final FilterNode node, final Flipper flipper, List<Attribute<T, Serializable>> attrs, final List<ColumnValue> values) {
if (attrs == null || attrs.isEmpty() || node == null) { if (attrs == null || attrs.isEmpty() || node == null) {
return (T[]) Array.newInstance(type, 0); return (T[]) Creator.newArray(type, 0);
} }
Stream<T> stream = this.list.stream(); Stream<T> stream = this.list.stream();
final Comparator<T> comparator = createComparator(flipper); final Comparator<T> comparator = createComparator(flipper);
@@ -904,7 +903,7 @@ public final class EntityCache<T> {
if (flipper != null && flipper.getLimit() > 0) { if (flipper != null && flipper.getLimit() > 0) {
stream = stream.limit(flipper.getLimit()); stream = stream.limit(flipper.getLimit());
} }
T[] rms = stream.filter(node.createPredicate(this)).toArray(len -> (T[]) Array.newInstance(type, len)); T[] rms = stream.filter(node.createPredicate(this)).toArray(Creator.arrayFunction(type));
tableLock.lock(); //表锁, 可优化成行锁 tableLock.lock(); //表锁, 可优化成行锁
try { try {
for (T rs : rms) { for (T rs : rms) {

View File

@@ -9,8 +9,8 @@ import java.lang.reflect.TypeVariable;
import java.util.*; import java.util.*;
import java.util.function.*; import java.util.function.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES; import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.*; import org.redkale.asm.*;
import static org.redkale.asm.Opcodes.*;
import org.redkale.util.Attribute; import org.redkale.util.Attribute;
/** /**
@@ -802,7 +802,7 @@ public interface Attribute<T, F> {
} }
final Class pcolumn = column; final Class pcolumn = column;
if (column.isPrimitive()) { if (column.isPrimitive()) {
column = java.lang.reflect.Array.get(java.lang.reflect.Array.newInstance(column, 1), 0).getClass(); column = TypeToken.primitiveToWrapper(column);
} }
final String supDynName = Attribute.class.getName().replace('.', '/'); final String supDynName = Attribute.class.getName().replace('.', '/');
final String interName = TypeToken.typeToClass(subclass).getName().replace('.', '/'); final String interName = TypeToken.typeToClass(subclass).getName().replace('.', '/');

View File

@@ -143,7 +143,6 @@ public interface Creator<T> {
if (type == double.class) { if (type == double.class) {
return (T[]) (Object) new double[size]; return (T[]) (Object) new double[size];
} }
//return (T[]) Array.newInstance(type, size);
return arrayFunction(type).apply(size); return arrayFunction(type).apply(size);
} }
@@ -491,7 +490,7 @@ public interface Creator<T> {
mv.visitInsn(AALOAD); mv.visitInsn(AALOAD);
final Class ct = constructorParameters[i].getValue(); final Class ct = constructorParameters[i].getValue();
if (ct.isPrimitive()) { if (ct.isPrimitive()) {
final Class bigct = Array.get(Array.newInstance(ct, 1), 0).getClass(); final Class bigct = TypeToken.primitiveToWrapper(ct);
mv.visitTypeInsn(CHECKCAST, bigct.getName().replace('.', '/')); mv.visitTypeInsn(CHECKCAST, bigct.getName().replace('.', '/'));
try { try {
Method pm = bigct.getMethod(ct.getSimpleName() + "Value"); Method pm = bigct.getMethod(ct.getSimpleName() + "Value");

View File

@@ -1091,7 +1091,7 @@ public final class ResourceFactory {
} }
} }
if (newVal == null && classType.isPrimitive()) { if (newVal == null && classType.isPrimitive()) {
newVal = Array.get(Array.newInstance(classType, 1), 0); newVal = Array.get(Creator.newArray(classType, 1), 0);
} }
Object oldVal = null; Object oldVal = null;
if (element.listener != null) { if (element.listener != null) {

View File

@@ -124,7 +124,7 @@ public abstract class TypeToken<T> {
return null; return null;
} }
if (type instanceof GenericArrayType) { if (type instanceof GenericArrayType) {
return Array.newInstance(typeToClass(((GenericArrayType) type).getGenericComponentType()), 0).getClass(); return Creator.newArray(typeToClass(((GenericArrayType) type).getGenericComponentType()), 0).getClass();
} }
if (!(type instanceof ParameterizedType)) { if (!(type instanceof ParameterizedType)) {
return null; //只能是null了 return null; //只能是null了
@@ -147,6 +147,30 @@ public abstract class TypeToken<T> {
} }
return newTypes; return newTypes;
} }
public static Class primitiveToWrapper(Class clazz) {
if (clazz == boolean.class) {
return Boolean.class;
} else if (clazz == byte.class) {
return Byte.class;
} else if (clazz == char.class) {
return Character.class;
} else if (clazz == short.class) {
return Short.class;
} else if (clazz == int.class) {
return Integer.class;
} else if (clazz == float.class) {
return Float.class;
} else if (clazz == long.class) {
return Long.class;
} else if (clazz == double.class) {
return Double.class;
} else if (clazz == void.class) {
return Void.class;
} else {
return clazz;
}
}
// //
// public static void main(String[] args) throws Throwable { // public static void main(String[] args) throws Throwable {
// Method tt0 = C.class.getMethod("getValue"); // Method tt0 = C.class.getMethod("getValue");

View File

@@ -601,7 +601,7 @@ public final class Utility {
if (array == null || array.length == 0) { if (array == null || array.length == 0) {
return objs; return objs;
} }
final T[] news = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length + objs.length); final T[] news = (T[]) Creator.newArray(array.getClass().getComponentType(), array.length + objs.length);
System.arraycopy(objs, 0, news, 0, objs.length); System.arraycopy(objs, 0, news, 0, objs.length);
System.arraycopy(array, 0, news, objs.length, array.length); System.arraycopy(array, 0, news, objs.length, array.length);
return news; return news;
@@ -631,10 +631,10 @@ public final class Utility {
if (one == null) { if (one == null) {
return array; return array;
} }
T[] news = (T[]) Array.newInstance(one.getClass(), objs.size()); T[] news = (T[]) Creator.newArray(one.getClass(), objs.size());
return objs.toArray(news); return objs.toArray(news);
} }
T[] news = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length + objs.size()); T[] news = (T[]) Creator.newArray(array.getClass().getComponentType(), array.length + objs.size());
int index = -1; int index = -1;
for (T t : objs) { for (T t : objs) {
news[(++index)] = t; news[(++index)] = t;
@@ -1124,7 +1124,7 @@ public final class Utility {
if (objs == null || objs.length == 0) { if (objs == null || objs.length == 0) {
return array; return array;
} }
final T[] news = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length + objs.length); final T[] news = (T[]) Creator.newArray(array.getClass().getComponentType(), array.length + objs.length);
System.arraycopy(array, 0, news, 0, array.length); System.arraycopy(array, 0, news, 0, array.length);
System.arraycopy(objs, 0, news, array.length, objs.length); System.arraycopy(objs, 0, news, array.length, objs.length);
return news; return news;
@@ -1176,10 +1176,10 @@ public final class Utility {
if (one == null) { if (one == null) {
return array; return array;
} }
T[] news = (T[]) Array.newInstance(one.getClass(), objs.size()); T[] news = (T[]) Creator.newArray(one.getClass(), objs.size());
return objs.toArray(news); return objs.toArray(news);
} }
T[] news = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length + objs.size()); T[] news = (T[]) Creator.newArray(array.getClass().getComponentType(), array.length + objs.size());
System.arraycopy(array, 0, news, 0, array.length); System.arraycopy(array, 0, news, 0, array.length);
int index = -1; int index = -1;
for (T t : objs) { for (T t : objs) {
@@ -1242,7 +1242,7 @@ public final class Utility {
if (array == null || array.length == 0 || filter == null) { if (array == null || array.length == 0 || filter == null) {
return array; return array;
} }
final T[] news = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length); final T[] news = (T[]) Creator.newArray(array.getClass().getComponentType(), array.length);
int index = 0; int index = 0;
for (int i = 0; i < news.length; i++) { for (int i = 0; i < news.length; i++) {
if (!filter.test(array[i])) { if (!filter.test(array[i])) {
@@ -1252,7 +1252,7 @@ public final class Utility {
if (index == array.length) { if (index == array.length) {
return array; return array;
} }
final T[] rs = (T[]) Array.newInstance(array.getClass().getComponentType(), index); final T[] rs = (T[]) Creator.newArray(array.getClass().getComponentType(), index);
System.arraycopy(news, 0, rs, 0, index); System.arraycopy(news, 0, rs, 0, index);
return rs; return rs;
} }