调整生成动态字节码时的ClassLoader

This commit is contained in:
redkale
2024-10-11 12:26:13 +08:00
parent 1dc07638e5
commit f86f82db8d
48 changed files with 550 additions and 564 deletions

View File

@@ -29,7 +29,7 @@ import static org.redkale.asm.Opcodes.LLOAD;
import static org.redkale.asm.Opcodes.LRETURN;
import static org.redkale.asm.Opcodes.RETURN;
import org.redkale.inject.ResourceFactory;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.Utility;
/**
@@ -101,7 +101,7 @@ public abstract class AsmMethodBoost<T> {
* @return 下一个新的方法名不做任何处理应返回参数newMethodName
*/
public abstract AsmNewMethod doMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
Class serviceImplClass,
String newDynName,
@@ -119,7 +119,7 @@ public abstract class AsmMethodBoost<T> {
* @param fieldPrefix 动态字段的前缀
*/
public void doAfterMethods(
DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {}
RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {}
/**
* 处理所有动态方法后调用
@@ -132,7 +132,7 @@ public abstract class AsmMethodBoost<T> {
* @param remote 是否远程模式
*/
public void doConstructorMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
MethodVisitor mv,
String newDynName,
@@ -145,7 +145,7 @@ public abstract class AsmMethodBoost<T> {
* @param resourceFactory ResourceFactory
* @param service 实例对象
*/
public abstract void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, T service);
public abstract void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, T service);
protected AsmMethodBean getMethodBean(Method method) {
Map<String, AsmMethodBean> methodBeans = AsmMethodBoost.getMethodBeans(serviceType);
@@ -325,7 +325,7 @@ public abstract class AsmMethodBoost<T> {
@Override
public AsmNewMethod doMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
Class serviceImplClass,
String newDynName,
@@ -345,7 +345,7 @@ public abstract class AsmMethodBoost<T> {
@Override
public void doAfterMethods(
DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
for (AsmMethodBoost item : items) {
if (item != null) {
item.doAfterMethods(classLoader, cw, newDynName, fieldPrefix);
@@ -355,7 +355,7 @@ public abstract class AsmMethodBoost<T> {
@Override
public void doConstructorMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
MethodVisitor mv,
String newDynName,
@@ -369,7 +369,7 @@ public abstract class AsmMethodBoost<T> {
}
@Override
public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, T service) {
public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, T service) {
for (AsmMethodBoost item : items) {
if (item != null) {
item.doInstance(classLoader, resourceFactory, service);

View File

@@ -143,7 +143,8 @@ class AppConfig {
if (cacheClasses == null) {
this.classLoader = new RedkaleClassLoader(currClassLoader);
} else {
this.classLoader = new RedkaleClassLoader.RedkaleCacheClassLoader(currClassLoader, cacheClasses);
this.classLoader = new RedkaleClassLoader.RedkaleCacheClassLoader(
RedkaleClassLoader.getRedkaleClassLoader(currClassLoader), cacheClasses);
}
Thread.currentThread().setContextClassLoader(this.classLoader);
}

View File

@@ -114,7 +114,7 @@ public abstract class NodeServer {
|| application.getServerClassLoader() instanceof RedkaleClassLoader.RedkaleCacheClassLoader) {
this.serverClassLoader = application.getServerClassLoader();
} else {
this.serverClassLoader = new RedkaleClassLoader(application.getServerClassLoader());
this.serverClassLoader = RedkaleClassLoader.getRedkaleClassLoader(application.getServerClassLoader());
}
Thread.currentThread().setContextClassLoader(this.serverClassLoader);
this.serverThread = Thread.currentThread();

View File

@@ -30,7 +30,6 @@ import org.redkale.cached.Cached;
import org.redkale.inject.ResourceFactory;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.RedkaleException;
import org.redkale.util.ThrowSupplier;
import org.redkale.util.TypeToken;
@@ -63,7 +62,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost {
@Override
public AsmNewMethod doMethod(
final DynBytesClassLoader classLoader,
final RedkaleClassLoader classLoader,
final ClassWriter cw,
final Class serviceImplClass,
final String newDynName,
@@ -216,7 +215,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost {
}
@Override
public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
Class clazz = service.getClass();
if (actionMap == null) { // 为null表示没有调用过doMethod 动态类在编译是已经生成好了
actionMap = new LinkedHashMap<>();

View File

@@ -102,6 +102,10 @@ public final class DeMember<R extends Reader, T, F> {
return new DeMember<>(attribute, factory.loadDecoder(fieldType), null, null);
}
public void setPositionToIndex() {
this.index = this.position;
}
public final boolean accepts(String name) {
return attribute.field().equals(name);
}

View File

@@ -127,6 +127,10 @@ public final class EnMember<W extends Writer, T, F> {
return new EnMember<>(attribute, factory.loadEncoder(fieldtype), null, null, null);
}
public void setPositionToIndex() {
this.index = this.position;
}
public Object getFieldValue(T obj) {
F val = attribute.get(obj);
if (fieldFunc != null) {

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.ext;
import java.math.BigDecimal;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
import org.redkale.util.Utility;
/**
@@ -41,33 +40,4 @@ public class BigDecimalSimpledCoder<R extends Reader, W extends Writer> extends
return new BigDecimal(Utility.charArray(value));
}
/**
* BigDecimal 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigDecimalJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigDecimal> {
public static final BigDecimalJsonSimpledCoder instance = new BigDecimalJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigDecimal value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public BigDecimal convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
return new BigDecimal(str);
}
}
}

View File

@@ -8,7 +8,6 @@ package org.redkale.convert.ext;
import java.math.BigInteger;
import java.util.Objects;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
* BigInteger 的SimpledCoder实现
@@ -50,74 +49,4 @@ public class BigIntegerSimpledCoder<R extends Reader, W extends Writer> extends
return bytes == null ? null : new BigInteger(bytes);
}
/**
* BigInteger 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigIntegerJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigInteger> {
public static final BigIntegerJsonSimpledCoder instance = new BigIntegerJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigInteger value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public BigInteger convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
return new BigInteger(str);
}
}
/**
* BigInteger 的十六进制JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigIntegerHexJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigInteger> {
public static final BigIntegerHexJsonSimpledCoder instance = new BigIntegerHexJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigInteger value) {
if (value == null) {
out.writeNull();
} else {
String s = value.toString(16);
out.writeStandardString(s.charAt(0) == '-' ? ("-0x" + s.substring(1)) : ("0x" + s));
}
}
@Override
public BigInteger convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
if (str.length() > 2) {
if (str.charAt(0) == '0' && (str.charAt(1) == 'x' || str.charAt(1) == 'X')) {
return new BigInteger(str.substring(2), 16);
} else if (str.charAt(0) == '-'
&& str.length() > 3
&& str.charAt(1) == '0'
&& (str.charAt(2) == 'x' || str.charAt(2) == 'X')) {
return new BigInteger("-" + str.substring(3), 16);
}
}
return new BigInteger(str);
}
}
}

View File

@@ -9,8 +9,6 @@ import java.net.*;
import java.util.Arrays;
import java.util.Objects;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
import org.redkale.util.StringWrapper;
import org.redkale.util.Utility;
/**
@@ -108,69 +106,4 @@ public class InetAddressSimpledCoder<R extends Reader, W extends Writer> extends
}
}
}
/**
* InetAddress 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class InetAddressJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, InetAddress> {
public static final InetAddressJsonSimpledCoder instance = new InetAddressJsonSimpledCoder();
@Override
public void convertTo(W out, InetAddress value) {
if (value == null) {
out.writeNull();
return;
}
out.writeWrapper(new StringWrapper(value.getHostAddress()));
}
@Override
public InetAddress convertFrom(R in) {
String str = in.readString();
if (str == null) {
return null;
}
try {
return InetAddress.getByName(str);
} catch (Exception ex) {
return null;
}
}
}
/**
* InetSocketAddress 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class InetSocketAddressJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, InetSocketAddress> {
public static final InetSocketAddressJsonSimpledCoder instance = new InetSocketAddressJsonSimpledCoder();
@Override
public void convertTo(W out, InetSocketAddress value) {
if (value == null) {
out.writeNull();
return;
}
StringSimpledCoder.instance.convertTo(out, value.getHostString() + ":" + value.getPort());
}
@Override
public InetSocketAddress convertFrom(R in) {
String str = in.readStringValue();
if (str == null) {
return null;
}
int pos = str.indexOf(':');
return new InetSocketAddress(str.substring(0, pos), Integer.parseInt(str.substring(pos + 1)));
}
}
}

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.ext;
import java.time.Instant;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
* java.time.Instant 的SimpledCoder实现
@@ -33,27 +32,4 @@ public class InstantSimpledCoder<R extends Reader, W extends Writer> extends Sim
return t == -1 ? null : Instant.ofEpochMilli(t);
}
public static final class InstantJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, Instant> {
public static final InstantJsonSimpledCoder instance = new InstantJsonSimpledCoder();
@Override
public void convertTo(final W out, final Instant value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public Instant convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return Instant.parse(str);
}
}
}

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.ext;
import java.time.LocalDate;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
* java.time.LocalDate 的SimpledCoder实现
@@ -34,33 +33,4 @@ public class LocalDateSimpledCoder<R extends Reader, W extends Writer> extends S
return t == 0 ? null : LocalDate.of(t / 100_00, t % 100_00 / 100, t % 100);
}
/**
* java.time.LocalDate 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalDateJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalDate> {
public static final LocalDateJsonSimpledCoder instance = new LocalDateJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalDate value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalDate convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalDate.parse(str);
}
}
}

View File

@@ -8,7 +8,6 @@ package org.redkale.convert.ext;
import java.time.*;
import java.util.Objects;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
* java.time.LocalDateTime 的SimpledCoder实现
@@ -76,33 +75,4 @@ public class LocalDateTimeSimpledCoder<R extends Reader, W extends Writer> exten
return LocalDateTime.ofEpochSecond(v1, v2, ZoneOffset.UTC);
}
/**
* java.time.LocalDateTime 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalDateTimeJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalDateTime> {
public static final LocalDateTimeJsonSimpledCoder instance = new LocalDateTimeJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalDateTime value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalDateTime convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalDateTime.parse(str);
}
}
}

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.ext;
import java.time.LocalTime;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
/**
* java.time.LocalTime 的SimpledCoder实现
@@ -33,33 +32,4 @@ public class LocalTimeSimpledCoder<R extends Reader, W extends Writer> extends S
return t == -1 ? null : LocalTime.ofNanoOfDay(t);
}
/**
* java.time.LocalTime 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalTimeJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalTime> {
public static final LocalTimeJsonSimpledCoder instance = new LocalTimeJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalTime value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalTime convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalTime.parse(str);
}
}
}

View File

@@ -7,7 +7,6 @@ package org.redkale.convert.ext;
import java.util.Objects;
import org.redkale.convert.*;
import org.redkale.convert.json.*;
import org.redkale.util.*;
/**
@@ -53,33 +52,4 @@ public class Uint128SimpledCoder<R extends Reader, W extends Writer> extends Sim
return Uint128.create(bs);
}
/**
* Uint128 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class Uint128JsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, Uint128> {
public static final Uint128JsonSimpledCoder instance = new Uint128JsonSimpledCoder();
@Override
public void convertTo(final W out, final Uint128 value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public Uint128 convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return Uint128.create(Utility.hexToBin(str));
}
}
}

View File

@@ -0,0 +1,339 @@
/*
* Copyright (c) 2016-2116 Redkale
* All rights reserved.
*/
package org.redkale.convert.json;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import org.redkale.convert.SimpledCoder;
import org.redkale.convert.ext.StringSimpledCoder;
import org.redkale.util.StringWrapper;
import org.redkale.util.Uint128;
import org.redkale.util.Utility;
/**
*
* @author zhangjx
*/
public abstract class JsonCoders {
private JsonCoders() {
// do nothing
}
/**
* InetAddress 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class InetAddressJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, InetAddress> {
public static final InetAddressJsonSimpledCoder instance = new InetAddressJsonSimpledCoder();
@Override
public void convertTo(W out, InetAddress value) {
if (value == null) {
out.writeNull();
return;
}
out.writeWrapper(new StringWrapper(value.getHostAddress()));
}
@Override
public InetAddress convertFrom(R in) {
String str = in.readString();
if (str == null) {
return null;
}
try {
return InetAddress.getByName(str);
} catch (Exception ex) {
return null;
}
}
}
/**
* InetSocketAddress 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class InetSocketAddressJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, InetSocketAddress> {
public static final InetSocketAddressJsonSimpledCoder instance = new InetSocketAddressJsonSimpledCoder();
@Override
public void convertTo(W out, InetSocketAddress value) {
if (value == null) {
out.writeNull();
return;
}
StringSimpledCoder.instance.convertTo(out, value.getHostString() + ":" + value.getPort());
}
@Override
public InetSocketAddress convertFrom(R in) {
String str = in.readStringValue();
if (str == null) {
return null;
}
int pos = str.indexOf(':');
return new InetSocketAddress(str.substring(0, pos), Integer.parseInt(str.substring(pos + 1)));
}
}
/**
* Uint128 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class Uint128JsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, Uint128> {
public static final Uint128JsonSimpledCoder instance = new Uint128JsonSimpledCoder();
@Override
public void convertTo(final W out, final Uint128 value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public Uint128 convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return Uint128.create(Utility.hexToBin(str));
}
}
/**
* BigInteger 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigIntegerJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigInteger> {
public static final BigIntegerJsonSimpledCoder instance = new BigIntegerJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigInteger value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public BigInteger convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
return new BigInteger(str);
}
}
/**
* BigInteger 的十六进制JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigIntegerHexJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigInteger> {
public static final BigIntegerHexJsonSimpledCoder instance = new BigIntegerHexJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigInteger value) {
if (value == null) {
out.writeNull();
} else {
String s = value.toString(16);
out.writeStandardString(s.charAt(0) == '-' ? ("-0x" + s.substring(1)) : ("0x" + s));
}
}
@Override
public BigInteger convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
if (str.length() > 2) {
if (str.charAt(0) == '0' && (str.charAt(1) == 'x' || str.charAt(1) == 'X')) {
return new BigInteger(str.substring(2), 16);
} else if (str.charAt(0) == '-'
&& str.length() > 3
&& str.charAt(1) == '0'
&& (str.charAt(2) == 'x' || str.charAt(2) == 'X')) {
return new BigInteger("-" + str.substring(3), 16);
}
}
return new BigInteger(str);
}
}
/**
* BigDecimal 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static class BigDecimalJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, BigDecimal> {
public static final BigDecimalJsonSimpledCoder instance = new BigDecimalJsonSimpledCoder();
@Override
public void convertTo(final W out, final BigDecimal value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public BigDecimal convertFrom(R in) {
final String str = in.readString();
if (str == null) {
return null;
}
return new BigDecimal(str);
}
}
public static final class InstantJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, Instant> {
public static final InstantJsonSimpledCoder instance = new InstantJsonSimpledCoder();
@Override
public void convertTo(final W out, final Instant value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public Instant convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return Instant.parse(str);
}
}
/**
* java.time.LocalDate 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalDateJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalDate> {
public static final LocalDateJsonSimpledCoder instance = new LocalDateJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalDate value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalDate convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalDate.parse(str);
}
}
/**
* java.time.LocalTime 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalTimeJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalTime> {
public static final LocalTimeJsonSimpledCoder instance = new LocalTimeJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalTime value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalTime convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalTime.parse(str);
}
}
/**
* java.time.LocalDateTime 的JsonSimpledCoder实现
*
* @param <R> Reader输入的子类型
* @param <W> Writer输出的子类型
*/
public static final class LocalDateTimeJsonSimpledCoder<R extends JsonReader, W extends JsonWriter>
extends SimpledCoder<R, W, LocalDateTime> {
public static final LocalDateTimeJsonSimpledCoder instance = new LocalDateTimeJsonSimpledCoder();
@Override
public void convertTo(final W out, final LocalDateTime value) {
if (value == null) {
out.writeNull();
} else {
out.writeStandardString(value.toString());
}
}
@Override
public LocalDateTime convertFrom(R in) {
final String str = in.readStandardString();
if (str == null) {
return null;
}
return LocalDateTime.parse(str);
}
}
}

View File

@@ -66,10 +66,7 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
}
}
final Map<String, AccessibleObject> mixedNames = mixedNames0;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != clazz.getClassLoader()) {
loader = clazz.getClassLoader();
}
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/convert/json/_Dyn" + JsonDynEncoder.class.getSimpleName() + "__"
+ clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_"
+ Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert
@@ -683,11 +680,7 @@ public abstract class JsonDynEncoder<T> extends ObjectEncoder<JsonWriter, T> {
cw.visitEnd();
// ------------------------------------------------------------------------------
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(
newClazz, newDynName.replace('/', '.'), JsonFactory.class, Type.class);

View File

@@ -10,7 +10,6 @@ import java.lang.reflect.Type;
import java.math.*;
import java.net.*;
import org.redkale.convert.*;
import org.redkale.convert.ext.*;
import org.redkale.util.Uint128;
/**
@@ -42,16 +41,15 @@ public final class JsonFactory extends ConvertFactory<JsonReader, JsonWriter> {
private JsonFactory(JsonFactory parent, int features) {
super(parent, features);
if (parent == null) {
this.register(InetAddress.class, InetAddressSimpledCoder.InetAddressJsonSimpledCoder.instance);
this.register(InetSocketAddress.class, InetAddressSimpledCoder.InetSocketAddressJsonSimpledCoder.instance);
this.register(Uint128.class, Uint128SimpledCoder.Uint128JsonSimpledCoder.instance);
this.register(BigInteger.class, BigIntegerSimpledCoder.BigIntegerJsonSimpledCoder.instance);
this.register(BigDecimal.class, BigDecimalSimpledCoder.BigDecimalJsonSimpledCoder.instance);
this.register(java.time.Instant.class, InstantSimpledCoder.InstantJsonSimpledCoder.instance);
this.register(java.time.LocalDate.class, LocalDateSimpledCoder.LocalDateJsonSimpledCoder.instance);
this.register(java.time.LocalTime.class, LocalTimeSimpledCoder.LocalTimeJsonSimpledCoder.instance);
this.register(
java.time.LocalDateTime.class, LocalDateTimeSimpledCoder.LocalDateTimeJsonSimpledCoder.instance);
this.register(InetAddress.class, JsonCoders.InetAddressJsonSimpledCoder.instance);
this.register(InetSocketAddress.class, JsonCoders.InetSocketAddressJsonSimpledCoder.instance);
this.register(Uint128.class, JsonCoders.Uint128JsonSimpledCoder.instance);
this.register(BigInteger.class, JsonCoders.BigIntegerJsonSimpledCoder.instance);
this.register(BigDecimal.class, JsonCoders.BigDecimalJsonSimpledCoder.instance);
this.register(java.time.Instant.class, JsonCoders.InstantJsonSimpledCoder.instance);
this.register(java.time.LocalDate.class, JsonCoders.LocalDateJsonSimpledCoder.instance);
this.register(java.time.LocalTime.class, JsonCoders.LocalTimeJsonSimpledCoder.instance);
this.register(java.time.LocalDateTime.class, JsonCoders.LocalDateTimeJsonSimpledCoder.instance);
this.register(JsonElement.class, (Decodeable) JsonElementDecoder.instance);
this.register(JsonString.class, (Decodeable) JsonElementDecoder.instance);

View File

@@ -47,6 +47,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
protected static ProtobufDynEncoder generateDyncEncoder(final ProtobufFactory factory, final Class clazz) {
final ObjectEncoder selfObjEncoder = factory.createObjectEncoder(clazz);
factory.register(clazz, selfObjEncoder);
selfObjEncoder.init(factory); // 必须执行初始化EnMember内部信息
final Map<String, SimpledCoder> simpledCoders = new HashMap<>();
@@ -68,10 +69,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
}
}
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != clazz.getClassLoader()) {
loader = clazz.getClassLoader();
}
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/convert/pb/_Dyn" + ProtobufDynEncoder.class.getSimpleName() + "__"
+ clazz.getName().replace('.', '_').replace('$', '_') + "_" + factory.getFeatures() + "_"
+ Utility.md5Hex(elementb.toString()); // tiny必须要加上, 同一个类会有多个字段定制Convert
@@ -323,12 +321,7 @@ public abstract class ProtobufDynEncoder<T> extends ProtobufObjectEncoder<T> {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<ProtobufDynEncoder> newClazz = (Class<ProtobufDynEncoder>)
new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<ProtobufDynEncoder> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -21,6 +21,9 @@ import org.redkale.util.*;
/** @author zhangjx */
public class ProtobufFactory extends ConvertFactory<ProtobufReader, ProtobufWriter> {
static final boolean INDEX_CHECK =
"true".equalsIgnoreCase(System.getProperty("redkale.convert.protobuf.indexcheck", "false"));
private static final ProtobufFactory instance = new ProtobufFactory(
null,
getSystemPropertyInt("redkale.convert.protobuf.tiny", "redkale.convert.tiny", true, Convert.FEATURE_TINY)

View File

@@ -37,8 +37,12 @@ public class ProtobufObjectDecoder<T> extends ObjectDecoder<ProtobufReader, T>
@Override
protected void initForEachDeMember(ConvertFactory factory, DeMember member) {
if (member.getIndex() < 1) {
throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @"
+ ConvertColumn.class.getSimpleName() + ".index");
if (ProtobufFactory.INDEX_CHECK) {
throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @"
+ ConvertColumn.class.getSimpleName() + ".index");
} else {
member.setPositionToIndex();
}
}
Attribute attr = member.getAttribute();
boolean enumtostring = ((ProtobufFactory) factory).enumtostring;

View File

@@ -85,8 +85,12 @@ public class ProtobufObjectEncoder<T> extends ObjectEncoder<ProtobufWriter, T>
@Override
protected void initForEachEnMember(ConvertFactory factory, EnMember member) {
if (member.getIndex() < 1) {
throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @"
+ ConvertColumn.class.getSimpleName() + ".index");
if (ProtobufFactory.INDEX_CHECK) {
throw new ConvertException(Utility.orElse(member.getField(), member.getMethod()) + " not found @"
+ ConvertColumn.class.getSimpleName() + ".index");
} else {
member.setPositionToIndex();
}
}
Attribute attr = member.getAttribute();
boolean enumtostring = ((ProtobufFactory) factory).enumtostring;

View File

@@ -20,7 +20,7 @@ import org.redkale.asm.Type;
import org.redkale.inject.ResourceFactory;
import org.redkale.locked.Locked;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleException;
/** @author zhangjx */
@@ -39,7 +39,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost {
@Override
public AsmNewMethod doMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
Class serviceImplClass,
String newDynName,
@@ -91,12 +91,12 @@ public class LockedAsmMethodBoost extends AsmMethodBoost {
}
@Override
public void doAfterMethods(DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
public void doAfterMethods(RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
// do nothing
}
@Override
public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
// do nothing
}
}

View File

@@ -53,7 +53,6 @@ import org.redkale.mq.ResourceConsumer;
import org.redkale.mq.spi.DynForMessaged.DynForMessageds;
import org.redkale.service.LoadMode;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.RedkaleException;
import org.redkale.util.TypeToken;
import org.redkale.util.Utility;
@@ -83,7 +82,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
@Override
public AsmNewMethod doMethod(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
ClassWriter cw,
Class serviceImplClass,
String newDynName,
@@ -322,7 +321,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
}
@Override
public void doAfterMethods(DynBytesClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
public void doAfterMethods(RedkaleClassLoader classLoader, ClassWriter cw, String newDynName, String fieldPrefix) {
if (Utility.isNotEmpty(consumerBytes)) {
AnnotationVisitor av0 = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(DynForMessageds.class), true);
AnnotationVisitor av1 = av0.visitArray("value");
@@ -342,7 +341,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost {
}
@Override
public void doInstance(DynBytesClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
public void doInstance(RedkaleClassLoader classLoader, ResourceFactory resourceFactory, Object service) {
DynForMessaged[] dyns = service.getClass().getAnnotationsByType(DynForMessaged.class);
if (Utility.isNotEmpty(dyns)) {
try {

View File

@@ -47,7 +47,6 @@ import org.redkale.service.Service;
import org.redkale.util.AnyValue;
import org.redkale.util.AnyValueWriter;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.RedkaleException;
import org.redkale.util.Utility;
@@ -455,11 +454,11 @@ public class MessageModuleEngine extends ModuleEngine {
}
}
if (boost != null && Utility.isNotEmpty(boost.consumerBytes)) {
DynBytesClassLoader classLoader = DynBytesClassLoader.create(null);
RedkaleClassLoader classLoader = RedkaleClassLoader.getRedkaleClassLoader();
boost.consumerBytes.forEach((innerFullName, bytes) -> {
try {
String clzName = innerFullName.replace('/', '.');
Class<? extends MessageConsumer> clazz = (Class) classLoader.loadClass(clzName, bytes);
Class<? extends MessageConsumer> clazz = classLoader.loadClass(clzName, bytes);
RedkaleClassLoader.putDynClass(clzName, bytes, clazz);
RedkaleClassLoader.putReflectionPublicConstructors(clazz, clzName);
MessageConsumer consumer = (MessageConsumer) clazz.getConstructors()[0].newInstance(service);

View File

@@ -108,11 +108,10 @@ public class HttpContext extends Context {
final String handlerDesc = Type.getDescriptor(CompletionHandler.class);
final String newDynName = "org/redkaledyn/http/handler/_DynHttpAsyncHandler__"
+ handlerClass.getName().replace('.', '/').replace('$', '_');
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
try {
Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.'));
Class newHandlerClazz = clz == null
? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.'))
: clz;
Class newHandlerClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz;
return Creator.create(newHandlerClazz);
} catch (Throwable ex) {
// do nothing
@@ -214,12 +213,7 @@ public class HttpContext extends Context {
}
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<CompletionHandler> newClazz = (Class<CompletionHandler>)
new ClassLoader(handlerClass.getClassLoader()) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<CompletionHandler> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
return (Creator<H>) Creator.create(newClazz);
}

View File

@@ -560,13 +560,12 @@ public class HttpServlet extends Servlet<HttpContext, HttpRequest, HttpResponse>
for (Class cz : method.getParameterTypes()) {
tmpps.append("__").append(cz.getName().replace('.', '_'));
}
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/http/servlet/action/_DynHttpActionServlet__"
+ this.getClass().getName().replace('.', '_').replace('$', '_') + "__" + method.getName() + tmpps;
try {
Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.'));
Class newClazz = clz == null
? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.'))
: clz;
Class newClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz;
HttpServlet instance =
(HttpServlet) newClazz.getDeclaredConstructor().newInstance();
instance.getClass().getField("_factServlet").set(instance, this);
@@ -627,11 +626,7 @@ public class HttpServlet extends Servlet<HttpContext, HttpRequest, HttpResponse>
cw.visitEnd();
// ------------------------------------------------------------------------------
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(this.getClass().getClassLoader()) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -29,7 +29,6 @@ import org.redkale.net.sncp.Sncp;
import org.redkale.service.*;
import org.redkale.source.Flipper;
import org.redkale.util.*;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import static org.redkale.util.Utility.isEmpty;
/**
@@ -661,7 +660,7 @@ public final class Rest {
mv.visitEnd();
}
DynBytesClassLoader newLoader = new DynBytesClassLoader(loader);
RedkaleClassLoader newLoader = RedkaleClassLoader.getRedkaleClassLoader(loader);
Map<String, Annotation[]> msgclassToAnnotations = new HashMap<>();
for (int i = 0; i < messageMethods.size(); i++) { // _DyncXXXWebSocketMessage 子消息List
final Method method = messageMethods.get(i);
@@ -1990,7 +1989,7 @@ public final class Rest {
return null; // 没有可HttpMapping的方法
}
Collections.sort(entrys);
DynBytesClassLoader newLoader = new DynBytesClassLoader(loader);
RedkaleClassLoader newLoader = RedkaleClassLoader.getRedkaleClassLoader(loader);
final int moduleid = controller == null ? 0 : controller.moduleid();
{ // 注入 @WebServlet 注解
String urlpath = "";
@@ -4073,7 +4072,7 @@ public final class Rest {
}
cw2.visitEnd();
byte[] bytes = cw2.toByteArray();
newLoader.addClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes);
newLoader.addDynClass((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes);
innerClassBytesMap.put((newDynName + "$" + entry.newActionClassName).replace('/', '.'), bytes);
}
} // end for each
@@ -4237,7 +4236,7 @@ public final class Rest {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
newLoader.addClass(newDynName.replace('/', '.'), bytes);
newLoader.addDynClass(newDynName.replace('/', '.'), bytes);
try {
Class<?> newClazz = newLoader.findClass(newDynName.replace('/', '.'));
innerClassBytesMap.forEach((n, bs) -> {

View File

@@ -26,7 +26,6 @@ import org.redkale.scheduled.Scheduled;
import org.redkale.service.*;
import org.redkale.util.AnyValue;
import org.redkale.util.RedkaleClassLoader;
import org.redkale.util.RedkaleClassLoader.DynBytesClassLoader;
import org.redkale.util.TypeToken;
import org.redkale.util.Uint128;
import org.redkale.util.Utility;
@@ -492,7 +491,7 @@ public abstract class Sncp {
*/
@SuppressWarnings("unchecked")
protected static <T extends Service> Class<? extends T> createLocalServiceClass(
DynBytesClassLoader dynLoader,
RedkaleClassLoader dynLoader,
final String name,
final Class<T> serviceImplClass,
final AsmMethodBoost methodBoost) {
@@ -626,7 +625,7 @@ public abstract class Sncp {
}
private static void createNewMethods(
DynBytesClassLoader classLoader,
RedkaleClassLoader classLoader,
Class clazz,
final AsmMethodBoost methodBoost,
Set<String> methodKeys,
@@ -766,7 +765,7 @@ public abstract class Sncp {
final String remoteGroup,
final AnyValue conf) {
try {
final DynBytesClassLoader dynLoader = DynBytesClassLoader.create(classLoader);
final RedkaleClassLoader dynLoader = RedkaleClassLoader.getRedkaleClassLoader(classLoader);
final Class newClazz = createLocalServiceClass(dynLoader, name, serviceImplClass, methodBoost);
T service = (T) newClazz.getDeclaredConstructor().newInstance();
// --------------------------------------
@@ -939,7 +938,7 @@ public abstract class Sncp {
final String sncpInfoDesc = Type.getDescriptor(SncpRemoteInfo.class);
final String sncpDynDesc = Type.getDescriptor(SncpDyn.class);
final String anyValueDesc = Type.getDescriptor(AnyValue.class);
final DynBytesClassLoader dynLoader = DynBytesClassLoader.create(classLoader);
final RedkaleClassLoader dynLoader = RedkaleClassLoader.getRedkaleClassLoader(classLoader);
String newDynName = "org/redkaledyn/service/remote/_DynRemoteService__"
+ serviceTypeOrImplClass.getName().replace('.', '_').replace('$', '_');
if (!name.isEmpty()) {

View File

@@ -74,7 +74,7 @@ public abstract class SncpActionServlet extends SncpServlet {
this.actionid = actionid;
this.method = method;
this.paramComposeBeanType = SncpRemoteAction.createParamComposeBeanType(
Thread.currentThread().getContextClassLoader(),
RedkaleClassLoader.getRedkaleClassLoader(),
Sncp.getServiceType(service),
method,
actionid,
@@ -356,10 +356,7 @@ public abstract class SncpActionServlet extends SncpServlet {
final boolean boolReturnTypeFuture = Future.class.isAssignableFrom(method.getReturnType());
final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionServlet__"
+ resourceType.getSimpleName() + "_" + method.getName() + "_" + actionid;
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != serviceClass.getClassLoader()) {
loader = serviceClass.getClassLoader();
}
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
Class<?> newClazz = null;
try {
Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.'));
@@ -630,11 +627,13 @@ public abstract class SncpActionServlet extends SncpServlet {
mv.visitVarInsn(ASTORE, 5); // paramBean
// 给CompletionHandler参数赋值
mv.visitVarInsn(ALOAD, 5);
mv.visitVarInsn(ALOAD, 2);
mv.visitMethodInsn(INVOKEVIRTUAL, responseName, "getParamAsyncHandler", "()" + handlerDesc, false);
mv.visitFieldInsn(PUTFIELD, paramComposeBeanName, "arg3", handlerDesc);
if (handlerFuncIndex >= 0) {
mv.visitVarInsn(ALOAD, 5);
mv.visitVarInsn(ALOAD, 2);
mv.visitMethodInsn(
INVOKEVIRTUAL, responseName, "getParamAsyncHandler", "()" + handlerDesc, false);
mv.visitFieldInsn(PUTFIELD, paramComposeBeanName, "arg" + (handlerFuncIndex + 1), handlerDesc);
}
// 调用service()
mv.visitVarInsn(ALOAD, 0);
mv.visitMethodInsn(INVOKEVIRTUAL, newDynName, "service", "()" + serviceDesc, false);
@@ -713,13 +712,10 @@ public abstract class SncpActionServlet extends SncpServlet {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {
RedkaleClassLoader.putReflectionField(newDynName.replace('/', '.'), newClazz.getField("service"));
} catch (Exception e) {

View File

@@ -3,13 +3,12 @@
*/
package org.redkale.net.sncp;
import static org.redkale.asm.Opcodes.*;
import java.lang.reflect.*;
import java.nio.channels.CompletionHandler;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import org.redkale.asm.*;
import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.Type;
import org.redkale.util.*;
@@ -55,11 +54,10 @@ public interface SncpAsyncHandler<V, A> extends CompletionHandler<V, A> {
final String realHandlerDesc = Type.getDescriptor(CompletionHandler.class);
final String newDynName = "org/redkaledyn/sncp/handler/_Dyn" + sncpHandlerClass.getSimpleName()
+ "__" + handlerClass.getName().replace('.', '/').replace('$', '_');
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
try {
Class clz = RedkaleClassLoader.findDynClass(newDynName.replace('/', '.'));
Class newHandlerClazz = clz == null
? Thread.currentThread().getContextClassLoader().loadClass(newDynName.replace('/', '.'))
: clz;
Class newHandlerClazz = clz == null ? loader.loadClass(newDynName.replace('/', '.')) : clz;
return (Creator<SncpAsyncHandler>) Creator.create(newHandlerClazz);
} catch (Throwable ex) {
// do nothing
@@ -208,13 +206,7 @@ public interface SncpAsyncHandler<V, A> extends CompletionHandler<V, A> {
}
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class newClazz =
new ClassLoader((handlerClass != CompletionHandler.class ? handlerClass : sncpHandlerClass)
.getClassLoader()) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
return (Creator<SncpAsyncHandler>) Creator.create(newClazz);
})

View File

@@ -26,7 +26,9 @@ import org.redkale.asm.FieldVisitor;
import org.redkale.asm.MethodDebugVisitor;
import static org.redkale.asm.Opcodes.*;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.Encodeable;
import org.redkale.convert.ObjectEncoder;
import org.redkale.convert.SimpledCoder;
import org.redkale.convert.pb.ProtobufFactory;
import org.redkale.service.RpcAttachment;
import org.redkale.service.RpcSourceAddress;
@@ -99,7 +101,12 @@ public final class SncpRemoteAction {
this.paramTypes = TypeToken.getGenericType(method.getGenericParameterTypes(), serviceImplClass);
this.paramClasses = method.getParameterTypes();
Type pt = createParamComposeBeanType(
serviceImplClass.getClassLoader(), serviceImplClass, method, actionid, paramTypes, paramClasses);
RedkaleClassLoader.getRedkaleClassLoader(),
serviceImplClass,
method,
actionid,
paramTypes,
paramClasses);
this.paramComposeBeanType = pt;
this.paramComposeBeanCreator =
(pt == null || pt == paramTypes[0]) ? null : Creator.load(TypeToken.typeToClass(pt), 1);
@@ -242,7 +249,7 @@ public final class SncpRemoteAction {
}
public static Type createParamComposeBeanType(
ClassLoader loader,
RedkaleClassLoader loader,
Class resourceType,
Method method,
Uint128 actionid,
@@ -251,17 +258,17 @@ public final class SncpRemoteAction {
if (paramTypes == null || paramTypes.length == 0) {
return null;
}
if (paramTypes.length == 1 && ProtobufFactory.root().createEncoder(paramTypes[0]) instanceof ObjectEncoder) {
return paramTypes[0];
if (paramTypes.length == 1) {
Encodeable encodeable = ProtobufFactory.root().findEncoder(paramTypes[0]);
if (encodeable == null) { // java.io.Serializable会预置直接调用createEncoder会提示不支持的Type
ProtobufFactory.root().createEncoder(paramTypes[0]);
}
if (encodeable instanceof ObjectEncoder || encodeable instanceof SimpledCoder) {
return paramTypes[0];
}
}
// 动态生成组合JavaBean类
if (loader == null) {
loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != resourceType.getClassLoader()) {
loader = resourceType.getClassLoader();
}
}
final String columnDesc = org.redkale.asm.Type.getDescriptor(ConvertColumn.class);
final String newDynName = "org/redkaledyn/sncp/servlet/action/_DynSncpActionParamBean_"
+ resourceType.getSimpleName() + "_" + method.getName() + "_" + actionid;
@@ -320,11 +327,7 @@ public final class SncpRemoteAction {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
Creator.load(newClazz, 1); // 只一个Object[]参数

View File

@@ -41,7 +41,7 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
protected final CompletionHandler realHandler = new CompletionHandler() {
@Override
public void completed(Object result, Object attachment) {
finish(paramHandlerResultType, result);
finish(paramHandlerType, result);
}
@Override
@@ -50,7 +50,7 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
}
};
protected Type paramHandlerResultType;
protected Type paramHandlerType;
protected CompletionHandler paramAsyncHandler;
@@ -80,11 +80,11 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
}
public SncpResponse paramAsyncHandler(
Class<? extends CompletionHandler> paramHandlerType, Type paramHandlerResultType) {
this.paramHandlerResultType = paramHandlerResultType;
this.paramAsyncHandler = paramHandlerType == CompletionHandler.class
Class<? extends CompletionHandler> paramHandlerClass, Type paramHandlerType) {
this.paramHandlerType = paramHandlerType;
this.paramAsyncHandler = paramHandlerClass == CompletionHandler.class
? realHandler
: SncpAsyncHandler.createHandler(paramHandlerType, realHandler);
: SncpAsyncHandler.createHandler(paramHandlerClass, realHandler);
return this;
}
@@ -101,7 +101,7 @@ public class SncpResponse extends Response<SncpContext, SncpRequest> {
@Override
protected boolean recycle() {
writer.clear();
this.paramHandlerResultType = null;
this.paramHandlerType = null;
this.paramAsyncHandler = null;
return super.recycle();
}

View File

@@ -80,10 +80,7 @@ public abstract class EntityFullFunc<T> {
final String objectDesc = Type.getDescriptor(Object.class);
final String serisDesc = Type.getDescriptor(Serializable[].class);
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != entityType.getClassLoader()) {
loader = entityType.getClassLoader();
}
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/source/_Dyn" + EntityFullFunc.class.getSimpleName() + "__"
+ entityType.getName().replace('.', '_').replace('$', '_');
try {
@@ -796,12 +793,7 @@ public abstract class EntityFullFunc<T> {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<EntityFullFunc> newClazz = (Class<EntityFullFunc>)
new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<EntityFullFunc> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -60,7 +60,7 @@ public final class DataSqlMapperBuilder {
if (!mapperType.isInterface()) {
throw new SourceException(mapperType + " is not interface");
}
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final Class entityType = entityType(mapperType);
final String supDynName = mapperType.getName().replace('.', '/');
final String newDynName = "org/redkaledyn/source/mapper/_DynDataSqlMapper_"
@@ -363,11 +363,7 @@ public final class DataSqlMapperBuilder {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionPublicConstructors(newClazz, newDynName.replace('/', '.'));
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));

View File

@@ -1002,11 +1002,11 @@ public interface Attribute<T, F> {
final String interDesc = Type.getDescriptor(TypeToken.typeToClass(subclass));
final String columnDesc = Type.getDescriptor(column);
Class realclz = TypeToken.typeToClass(subclass);
ClassLoader loader = Thread.currentThread().getContextClassLoader();
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
try {
loader.loadClass(realclz.getName());
} catch (ClassNotFoundException e) {
loader = realclz.getClassLoader();
// do nothing
}
String pkgname = "";
String clzname = newsubname.toString();
@@ -1233,12 +1233,7 @@ public interface Attribute<T, F> {
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<Attribute> newClazz = (Class<Attribute>)
new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<Attribute> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -679,7 +679,7 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
final String srcClassName = srcClass.getName().replace('.', '/');
final String destDesc = Type.getDescriptor(destClass);
final String srcDesc = Type.getDescriptor(srcClass);
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String utilClassName = Utility.class.getName().replace('.', '/');
final String newDynName = "org/redkaledyn/copier/_Dyn" + Copier.class.getSimpleName() + "_" + options
+ "__" + srcClass.getName().replace('.', '_').replace('$', '_')
@@ -1337,11 +1337,7 @@ public interface Copier<S, D> extends BiFunction<S, D, D> {
cw.visitEnd();
// ------------------------------------------------------------------------------
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -292,10 +292,8 @@ public interface Creator<T> {
final String supDynName = Creator.class.getName().replace('.', '/');
final String interName = clazz.getName().replace('.', '/');
final String interDesc = Type.getDescriptor(clazz);
ClassLoader loader = Thread.currentThread().getContextClassLoader();
if (String.class.getClassLoader() != clazz.getClassLoader()) {
loader = clazz.getClassLoader();
}
RedkaleClassLoader loader =
RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/creator/_Dyn" + Creator.class.getSimpleName() + "__"
+ clazz.getName().replace('.', '_').replace('$', '_') + (paramCount < 0 ? "" : ("_" + paramCount));
try {
@@ -571,11 +569,7 @@ public interface Creator<T> {
byte[] bytes = cw.toByteArray();
try {
Class newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
return (Creator) newClazz.getDeclaredConstructor().newInstance();

View File

@@ -231,7 +231,7 @@ class Inners {
}
final String interName = clazz.getName().replace('.', '/');
final String interDesc = org.redkale.asm.Type.getDescriptor(clazz);
final ClassLoader loader = clazz.getClassLoader();
final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/creator/_DynArrayFunction__"
+ clazz.getName().replace('.', '_').replace('$', '_');
try {
@@ -283,11 +283,7 @@ class Inners {
cw.visitEnd();
final byte[] bytes = cw.toByteArray();
try {
Class<?> resultClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> resultClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, resultClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(resultClazz, newDynName.replace('/', '.'));
return (IntFunction<T[]>) resultClazz.getDeclaredConstructor().newInstance();

View File

@@ -5,11 +5,10 @@
*/
package org.redkale.util;
import static org.redkale.asm.Opcodes.*;
import java.lang.reflect.*;
import java.util.concurrent.ConcurrentHashMap;
import org.redkale.asm.*;
import static org.redkale.asm.Opcodes.*;
import org.redkale.asm.Type;
/**
@@ -92,7 +91,7 @@ public interface Invoker<C, R> {
} else if (returnType == void.class) {
returnDesc = Type.getDescriptor(Void.class);
}
ClassLoader loader = Thread.currentThread().getContextClassLoader();
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
StringBuilder sbpts = new StringBuilder();
for (Class c : method.getParameterTypes()) {
sbpts.append('_').append(c.getName().replace('.', '_').replace('$', '_'));
@@ -209,11 +208,7 @@ public interface Invoker<C, R> {
Class<?> resultClazz = null;
try {
if (resultClazz == null) {
resultClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
resultClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
}
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, resultClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(resultClazz, newDynName.replace('/', '.'));

View File

@@ -89,6 +89,26 @@ public class RedkaleClassLoader extends URLClassLoader {
super(urls, parent);
}
public static RedkaleClassLoader getRedkaleClassLoader(ClassLoader loader) {
if (loader == null) {
loader = Thread.currentThread().getContextClassLoader();
}
if (loader instanceof RedkaleClassLoader) {
return (RedkaleClassLoader) loader;
}
ClassLoader c = loader;
while ((c = c.getParent()) != null) {
if (c instanceof RedkaleClassLoader) {
return (RedkaleClassLoader) c;
}
}
return new RedkaleClassLoader(loader);
}
public static RedkaleClassLoader getRedkaleClassLoader() {
return getRedkaleClassLoader(Thread.currentThread().getContextClassLoader());
}
public static URI getConfResourceAsURI(String confURI, String file) {
if (file.startsWith("http:") || file.startsWith("https:") || file.startsWith("ftp:")) {
return URI.create(file);
@@ -461,7 +481,20 @@ public class RedkaleClassLoader extends URLClassLoader {
reflectionMap.forEach(action);
}
public Class<?> loadClass(String name, byte[] b) {
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classData = dynClassBytesMap.get(name);
if (classData == null) {
Class clazz = dynClassTypeMap.get(name);
if (clazz != null) {
return clazz;
}
return super.findClass(name);
}
return super.defineClass(name, classData, 0, classData.length);
}
public Class loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
@@ -471,6 +504,10 @@ public class RedkaleClassLoader extends URLClassLoader {
}
}
public final void addDynClass(String name, byte[] bs) {
dynClassBytesMap.put(name, bs);
}
public void addURI(URI uri) {
try {
super.addURL(uri.toURL());
@@ -577,39 +614,4 @@ public class RedkaleClassLoader extends URLClassLoader {
}
}
}
public static class DynBytesClassLoader extends ClassLoader {
private final Map<String, byte[]> classes = new HashMap<>();
public DynBytesClassLoader(ClassLoader parent) {
super(parent);
}
public static DynBytesClassLoader create(ClassLoader parent) {
if (parent == null) {
parent = Thread.currentThread().getContextClassLoader();
}
return parent instanceof DynBytesClassLoader
? (DynBytesClassLoader) parent
: new DynBytesClassLoader(parent);
}
@Override
public Class<?> findClass(String name) throws ClassNotFoundException {
byte[] classData = classes.get(name);
if (classData == null) {
return super.findClass(name);
}
return super.defineClass(name, classData, 0, classData.length);
}
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
public final void addClass(String name, byte[] b) {
classes.put(name, b);
}
}
}

View File

@@ -1,12 +1,11 @@
package org.redkale.util;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
import java.lang.reflect.Modifier;
import java.util.Map;
import java.util.function.*;
import org.redkale.asm.*;
import static org.redkale.asm.ClassWriter.COMPUTE_FRAMES;
import static org.redkale.asm.Opcodes.*;
/**
* JavaBean类对象的拷贝相同的字段名会被拷贝 <br>
@@ -68,7 +67,7 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
final String srcClassName = srcClass.getName().replace('.', '/');
final String destDesc = Type.getDescriptor(destClass);
final String srcDesc = Type.getDescriptor(srcClass);
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
final RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
final String newDynName = "org/redkaledyn/reproduce/_Dyn" + Reproduce.class.getSimpleName()
+ "__" + destClass.getName().replace('.', '_').replace('$', '_')
+ "__" + srcClass.getName().replace('.', '_').replace('$', '_');
@@ -232,11 +231,7 @@ public interface Reproduce<D, S> extends BiFunction<D, S, D> {
cw.visitEnd();
// ------------------------------------------------------------------------------
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionDeclaredConstructors(newClazz, newDynName.replace('/', '.'));
try {

View File

@@ -662,7 +662,7 @@ public abstract class TypeToken<T> {
// 注意: RetResult<Map<String, Long>[]> 这种泛型带[]的尚未实现支持
private static Type createParameterizedType0(final Class rawType, final Type... actualTypeArguments) {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
RedkaleClassLoader loader = RedkaleClassLoader.getRedkaleClassLoader();
StringBuilder tmpps = new StringBuilder(getClassTypeDescriptor(rawType));
for (Type cz : actualTypeArguments) {
tmpps.append(" ").append(getClassTypeDescriptor(cz));
@@ -715,11 +715,7 @@ public abstract class TypeToken<T> {
}
cw.visitEnd();
byte[] bytes = cw.toByteArray();
Class<?> newClazz = new ClassLoader(loader) {
public final Class<?> loadClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}.loadClass(newDynName.replace('/', '.'), bytes);
Class<?> newClazz = loader.loadClass(newDynName.replace('/', '.'), bytes);
RedkaleClassLoader.putDynClass(newDynName.replace('/', '.'), bytes, newClazz);
RedkaleClassLoader.putReflectionPublicFields(newDynName.replace('/', '.'));
try {

View File

@@ -10,7 +10,7 @@ import java.util.*;
import org.junit.jupiter.api.*;
import org.redkale.convert.ConvertCoder;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.ext.BigIntegerSimpledCoder.BigIntegerHexJsonSimpledCoder;
import org.redkale.convert.json.JsonCoders.BigIntegerHexJsonSimpledCoder;
import org.redkale.convert.json.JsonConvert;
import org.redkale.convert.pb.ProtobufConvert;

View File

@@ -17,6 +17,7 @@ import java.util.function.Supplier;
import org.junit.jupiter.api.*;
import org.redkale.convert.ConvertColumn;
import org.redkale.convert.json.JsonConvert;
import org.redkale.convert.json.JsonFactory;
import org.redkale.convert.pb.ProtobufConvert;
import org.redkale.util.TypeToken;
import org.redkale.util.Utility;
@@ -43,6 +44,8 @@ public class GenericEntityTest {
@Test
public void runJson1() throws Exception {
System.out.println("-------------------- runJson1 ---------------------------------");
JsonFactory.root().loadEncoder(TreeNode.class);
JsonFactory.root().loadEncoder(TreeNode2.class);
JsonConvert convert = JsonConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean();
String json = convert.convertTo(ENTITY_TYPE, bean);
@@ -76,6 +79,8 @@ public class GenericEntityTest {
@Test
public void runPb1() throws Exception {
System.out.println("-------------------- runPb1 ---------------------------------");
JsonFactory.root().loadEncoder(TreeNode.class);
JsonFactory.root().loadEncoder(TreeNode2.class);
ProtobufConvert convert = ProtobufConvert.root();
GenericEntity<Long, String, SimpleEntity> bean = createBean();
byte[] bs = convert.convertTo(ENTITY_TYPE, bean);
@@ -137,6 +142,22 @@ public class GenericEntityTest {
return bean;
}
public static class TreeNode {
@ConvertColumn(index = 1)
public String name;
@ConvertColumn(index = 2)
public TreeNode next;
}
public static class TreeNode2 {
@ConvertColumn(index = 1)
public String name;
@ConvertColumn(index = 2)
public List<TreeNode2> next;
}
public static class GenericEntity<T, K, V> {
@ConvertColumn(index = 1)

View File

@@ -53,4 +53,6 @@ public class TinyTest {
public int id;
}
}

View File

@@ -50,7 +50,7 @@ public class SncpSleepService extends AbstractService {
getExecutor());
}
public String test(Serializable id, String[] names, Collection<File> files) {
public String test(Serializable id, String[] names, Collection<File> files, int time) {
return "ok";
}
}

View File

@@ -65,7 +65,7 @@ public class SncpSleepTest {
CompletableFuture.allOf(futures).join();
long e = System.currentTimeMillis() - s;
System.out.println("耗时: " + e + " ms");
remoteCService.test(333L, new String[] {"aaa", "bbb"}, List.of(new File("D:/a.txt"), new File("D:/b.txt")));
remoteCService.test(333L, new String[] {"aaa", "bbb"}, List.of(new File("D:/a.txt"), new File("D:/b.txt")), 2);
server.shutdown();
workExecutor.shutdown();
Assertions.assertTrue(e < 600);

View File

@@ -37,9 +37,9 @@ public class DynActionTestService_insert extends SncpActionServlet {
Convert<Reader, Writer> convert = request.getConvert();
Reader in = request.getReader();
DynSncpActionParamBean_TestService_insert bean = convert.convertFrom(paramComposeBeanType, in);
bean.arg0 = response.getParamAsyncHandler();
bean.arg1 = response.getParamAsyncHandler();
TestService serviceObj = (TestService) service();
serviceObj.insert(bean.arg0, bean.arg1, bean.arg2, bean.arg3);
serviceObj.insert(bean.arg1, bean.arg2, bean.arg3, bean.arg4);
response.finishVoid();
}
@@ -48,22 +48,22 @@ public class DynActionTestService_insert extends SncpActionServlet {
public DynSncpActionParamBean_TestService_insert() {}
public DynSncpActionParamBean_TestService_insert(Object[] params) {
this.arg0 = (BooleanHandler) params[0];
this.arg1 = (TestBean) params[1];
this.arg2 = (String) params[2];
this.arg3 = (int) params[3];
this.arg1 = (BooleanHandler) params[0];
this.arg2 = (TestBean) params[1];
this.arg3 = (String) params[2];
this.arg4 = (int) params[3];
}
@ConvertColumn(index = 1)
public BooleanHandler arg0;
public BooleanHandler arg1;
@ConvertColumn(index = 2)
public TestBean arg1;
public TestBean arg2;
@ConvertColumn(index = 3)
public String arg2;
public String arg3;
@ConvertColumn(index = 4)
public int arg3;
public int arg4;
}
}