From a5e79aac61cd43e57e84db7776aca89a5c5e60cd Mon Sep 17 00:00:00 2001 From: Zen Huifer Date: Sat, 18 Nov 2023 15:02:43 +0800 Subject: [PATCH] write a line into test.file --- ...s774586e8-85e0-11ee-b23a-acde48001122.java | 345 ++++++++++++++++++ ...s7785046c-85e0-11ee-b23a-acde48001122.java | 13 + ...s77c46300-85e0-11ee-b23a-acde48001122.java | 74 ++++ ...s7802ecec-85e0-11ee-b23a-acde48001122.java | 17 + 4 files changed, 449 insertions(+) create mode 100644 docs/spring/cs774586e8-85e0-11ee-b23a-acde48001122.java create mode 100644 docs/spring/cs7785046c-85e0-11ee-b23a-acde48001122.java create mode 100644 docs/spring/cs77c46300-85e0-11ee-b23a-acde48001122.java create mode 100644 docs/spring/cs7802ecec-85e0-11ee-b23a-acde48001122.java diff --git a/docs/spring/cs774586e8-85e0-11ee-b23a-acde48001122.java b/docs/spring/cs774586e8-85e0-11ee-b23a-acde48001122.java new file mode 100644 index 00000000..255283b2 --- /dev/null +++ b/docs/spring/cs774586e8-85e0-11ee-b23a-acde48001122.java @@ -0,0 +1,345 @@ +/** + * Copyright 2009-2019 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.reflection; + +import java.lang.reflect.*; +import java.util.Arrays; + +/** + * @author Iwao AVE! + */ +public class TypeParameterResolver { + + private TypeParameterResolver() { + super(); + } + + /** + * @return The field type as {@link Type}. If it has type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type resolveFieldType(Field field, Type srcType) { + // 获取需要解析的字段 + Type fieldType = field.getGenericType(); + // 获取字段类型 + Class declaringClass = field.getDeclaringClass(); + // 解析方式 + return resolveType(fieldType, srcType, declaringClass); + } + + /** + * @return The return type of the method as {@link Type}. If it has type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type resolveReturnType(Method method, Type srcType) { + // 获取返回值类型 + Type returnType = method.getGenericReturnType(); + // 获取方法的类型 + Class declaringClass = method.getDeclaringClass(); + return resolveType(returnType, srcType, declaringClass); + } + + /** + * @return The parameter types of the method as an array of {@link Type}s. If they have type parameters in the declaration,
+ * they will be resolved to the actual runtime {@link Type}s. + */ + public static Type[] resolveParamTypes(Method method, Type srcType) { + // 获取方法参数类型 + Type[] paramTypes = method.getGenericParameterTypes(); + // 方法定义类型 + Class declaringClass = method.getDeclaringClass(); + Type[] result = new Type[paramTypes.length]; + for (int i = 0; i < paramTypes.length; i++) { + // 遍历接信息 + result[i] = resolveType(paramTypes[i], srcType, declaringClass); + } + return result; + } + + private static Type resolveType(Type type, Type srcType, Class declaringClass) { + if (type instanceof TypeVariable) { + return resolveTypeVar((TypeVariable) type, srcType, declaringClass); + } else if (type instanceof ParameterizedType) { + return resolveParameterizedType((ParameterizedType) type, srcType, declaringClass); + } else if (type instanceof GenericArrayType) { + return resolveGenericArrayType((GenericArrayType) type, srcType, declaringClass); + } else { + return type; + } + } + + private static Type resolveGenericArrayType(GenericArrayType genericArrayType, Type srcType, Class declaringClass) { + Type componentType = genericArrayType.getGenericComponentType(); + Type resolvedComponentType = null; + if (componentType instanceof TypeVariable) { + // TypeVariable 类型解析 + resolvedComponentType = resolveTypeVar((TypeVariable) componentType, srcType, declaringClass); + } else if (componentType instanceof GenericArrayType) { + // GenericArrayType 类型解析 + resolvedComponentType = resolveGenericArrayType((GenericArrayType) componentType, srcType, declaringClass); + } else if (componentType instanceof ParameterizedType) { + // ParameterizedType 类型解析 + resolvedComponentType = resolveParameterizedType((ParameterizedType) componentType, srcType, declaringClass); + } + if (resolvedComponentType instanceof Class) { + // class 类型解析 + return Array.newInstance((Class) resolvedComponentType, 0).getClass(); + } else { + // 直接返回 + return new GenericArrayTypeImpl(resolvedComponentType); + } + } + + /** + * 解析 ParameterizedType + * + * @param parameterizedType + * @param srcType + * @param declaringClass + * @return + */ + private static ParameterizedType resolveParameterizedType(ParameterizedType parameterizedType, Type srcType, Class declaringClass) { + // 获取参数类型 + Class rawType = (Class) parameterizedType.getRawType(); + // 实际参数获取 + Type[] typeArgs = parameterizedType.getActualTypeArguments(); + Type[] args = typesToArgs(srcType, declaringClass, typeArgs); + return new ParameterizedTypeImpl(rawType, null, args); + } + + /** + * 提取的方法 不是原始的方便注释代码 ^_^ + * @param srcType + * @param declaringClass + * @param typeArgs + * @return + */ + private static Type[] typesToArgs(Type srcType, Class declaringClass, Type[] typeArgs) { + Type[] args = new Type[typeArgs.length]; + // 实际参数处理ß + for (int i = 0; i < typeArgs.length; i++) { + // 参数类型校验 + if (typeArgs[i] instanceof TypeVariable) { + args[i] = resolveTypeVar((TypeVariable) typeArgs[i], srcType, declaringClass); + } else if (typeArgs[i] instanceof ParameterizedType) { + args[i] = resolveParameterizedType((ParameterizedType) typeArgs[i], srcType, declaringClass); + } else if (typeArgs[i] instanceof WildcardType) { + args[i] = resolveWildcardType((WildcardType) typeArgs[i], srcType, declaringClass); + } else { + args[i] = typeArgs[i]; + } + } + return args; + } + + private static Type resolveWildcardType(WildcardType wildcardType, Type srcType, Class declaringClass) { + Type[] lowerBounds = resolveWildcardTypeBounds(wildcardType.getLowerBounds(), srcType, declaringClass); + Type[] upperBounds = resolveWildcardTypeBounds(wildcardType.getUpperBounds(), srcType, declaringClass); + return new WildcardTypeImpl(lowerBounds, upperBounds); + } + + private static Type[] resolveWildcardTypeBounds(Type[] bounds, Type srcType, Class declaringClass) { + Type[] result = typesToArgs(srcType, declaringClass, bounds); + return result; + } + + private static Type resolveTypeVar(TypeVariable typeVar, Type srcType, Class declaringClass) { + Type result; + Class clazz; + if (srcType instanceof Class) { + clazz = (Class) srcType; + } else if (srcType instanceof ParameterizedType) { + ParameterizedType parameterizedType = (ParameterizedType) srcType; + clazz = (Class) parameterizedType.getRawType(); + } else { + throw new IllegalArgumentException("The 2nd arg must be Class or ParameterizedType, but was: " + srcType.getClass()); + } + + if (clazz == declaringClass) { + Type[] bounds = typeVar.getBounds(); + if (bounds.length > 0) { + return bounds[0]; + } + return Object.class; + } + /** + * 获取父类类型,如果父类是泛型,则这里返回的是参数化类型ParameterizedType + */ + Type superclass = clazz.getGenericSuperclass(); + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superclass); + if (result != null) { + return result; + } + /** + * 获取实现的接口 + */ + Type[] superInterfaces = clazz.getGenericInterfaces(); + for (Type superInterface : superInterfaces) { + result = scanSuperTypes(typeVar, srcType, declaringClass, clazz, superInterface); + if (result != null) { + return result; + } + } + return Object.class; + } + + /** + * 扫描 上级类型 + * + * @param typeVar + * @param srcType + * @param declaringClass + * @param clazz + * @param superclass + * @return + */ + private static Type scanSuperTypes(TypeVariable typeVar, Type srcType, Class declaringClass, Class clazz, Type superclass) { + if (superclass instanceof ParameterizedType) { + ParameterizedType parentAsType = (ParameterizedType) superclass; + Class parentAsClass = (Class) parentAsType.getRawType(); + TypeVariable[] parentTypeVars = parentAsClass.getTypeParameters(); + if (srcType instanceof ParameterizedType) { + parentAsType = translateParentTypeVars((ParameterizedType) srcType, clazz, parentAsType); + } + if (declaringClass == parentAsClass) { + for (int i = 0; i < parentTypeVars.length; i++) { + if (typeVar == parentTypeVars[i]) { + return parentAsType.getActualTypeArguments()[i]; + } + } + } + if (declaringClass.isAssignableFrom(parentAsClass)) { + return resolveTypeVar(typeVar, parentAsType, declaringClass); + } + } else if (superclass instanceof Class && declaringClass.isAssignableFrom((Class) superclass)) { + return resolveTypeVar(typeVar, superclass, declaringClass); + } + return null; + } + + private static ParameterizedType translateParentTypeVars(ParameterizedType srcType, Class srcClass, ParameterizedType parentType) { + Type[] parentTypeArgs = parentType.getActualTypeArguments(); + Type[] srcTypeArgs = srcType.getActualTypeArguments(); + TypeVariable[] srcTypeVars = srcClass.getTypeParameters(); + Type[] newParentArgs = new Type[parentTypeArgs.length]; + boolean noChange = true; + for (int i = 0; i < parentTypeArgs.length; i++) { + if (parentTypeArgs[i] instanceof TypeVariable) { + for (int j = 0; j < srcTypeVars.length; j++) { + if (srcTypeVars[j] == parentTypeArgs[i]) { + noChange = false; + newParentArgs[i] = srcTypeArgs[j]; + } + } + } else { + newParentArgs[i] = parentTypeArgs[i]; + } + } + return noChange ? parentType : new ParameterizedTypeImpl((Class) parentType.getRawType(), null, newParentArgs); + } + + static class ParameterizedTypeImpl implements ParameterizedType { + private Class rawType; + + private Type ownerType; + + private Type[] actualTypeArguments; + + public ParameterizedTypeImpl(Class rawType, Type ownerType, Type[] actualTypeArguments) { + super(); + this.rawType = rawType; + this.ownerType = ownerType; + this.actualTypeArguments = actualTypeArguments; + } + + /** + * 获取参数列表的泛型 + * + * @return + */ + @Override + public Type[] getActualTypeArguments() { + return actualTypeArguments; + } + + @Override + public Type getOwnerType() { + return ownerType; + } + + /** + * 获取<>前面的类型,即基本类型 + * + * @return + */ + @Override + public Type getRawType() { + return rawType; + } + + @Override + public String toString() { + return "ParameterizedTypeImpl [rawType=" + rawType + ", ownerType=" + ownerType + ", actualTypeArguments=" + Arrays.toString(actualTypeArguments) + "]"; + } + } + + static class WildcardTypeImpl implements WildcardType { + /** + * 数据类型下限 super + */ + private Type[] lowerBounds; + + /** + * 数据类型上限 extend + */ + private Type[] upperBounds; + + WildcardTypeImpl(Type[] lowerBounds, Type[] upperBounds) { + super(); + this.lowerBounds = lowerBounds; + this.upperBounds = upperBounds; + } + + @Override + public Type[] getLowerBounds() { + return lowerBounds; + } + + @Override + public Type[] getUpperBounds() { + return upperBounds; + } + } + + static class GenericArrayTypeImpl implements GenericArrayType { + private Type genericComponentType; + + GenericArrayTypeImpl(Type genericComponentType) { + super(); + this.genericComponentType = genericComponentType; + } + + /** + * 获取元素 + * + * @return + */ + @Override + public Type getGenericComponentType() { + return genericComponentType; + } + } +} diff --git a/docs/spring/cs7785046c-85e0-11ee-b23a-acde48001122.java b/docs/spring/cs7785046c-85e0-11ee-b23a-acde48001122.java new file mode 100644 index 00000000..98ea30d1 --- /dev/null +++ b/docs/spring/cs7785046c-85e0-11ee-b23a-acde48001122.java @@ -0,0 +1,13 @@ +package org.example.domain.event.exception; + +public class EventException extends RuntimeException { + + private final Error error; + + + protected EventException(Error error) { + super(error.msg()); + this.error = error; + } + +} diff --git a/docs/spring/cs77c46300-85e0-11ee-b23a-acde48001122.java b/docs/spring/cs77c46300-85e0-11ee-b23a-acde48001122.java new file mode 100644 index 00000000..8b0c22ce --- /dev/null +++ b/docs/spring/cs77c46300-85e0-11ee-b23a-acde48001122.java @@ -0,0 +1,74 @@ +/** + * Copyright 2009-2018 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.ibatis.jdbc; + +import org.apache.ibatis.type.*; + +/** + * 对于 null 不同类型的描述, {类型处理器,jdbc类型} + * @author Clinton Begin + * @author Adam Gent + */ +public enum Null { + BOOLEAN(new BooleanTypeHandler(), JdbcType.BOOLEAN), + + BYTE(new ByteTypeHandler(), JdbcType.TINYINT), + SHORT(new ShortTypeHandler(), JdbcType.SMALLINT), + INTEGER(new IntegerTypeHandler(), JdbcType.INTEGER), + LONG(new LongTypeHandler(), JdbcType.BIGINT), + FLOAT(new FloatTypeHandler(), JdbcType.FLOAT), + DOUBLE(new DoubleTypeHandler(), JdbcType.DOUBLE), + BIGDECIMAL(new BigDecimalTypeHandler(), JdbcType.DECIMAL), + + STRING(new StringTypeHandler(), JdbcType.VARCHAR), + CLOB(new ClobTypeHandler(), JdbcType.CLOB), + LONGVARCHAR(new ClobTypeHandler(), JdbcType.LONGVARCHAR), + + BYTEARRAY(new ByteArrayTypeHandler(), JdbcType.LONGVARBINARY), + BLOB(new BlobTypeHandler(), JdbcType.BLOB), + LONGVARBINARY(new BlobTypeHandler(), JdbcType.LONGVARBINARY), + + OBJECT(new ObjectTypeHandler(), JdbcType.OTHER), + OTHER(new ObjectTypeHandler(), JdbcType.OTHER), + TIMESTAMP(new DateTypeHandler(), JdbcType.TIMESTAMP), + DATE(new DateOnlyTypeHandler(), JdbcType.DATE), + TIME(new TimeOnlyTypeHandler(), JdbcType.TIME), + SQLTIMESTAMP(new SqlTimestampTypeHandler(), JdbcType.TIMESTAMP), + SQLDATE(new SqlDateTypeHandler(), JdbcType.DATE), + SQLTIME(new SqlTimeTypeHandler(), JdbcType.TIME); + + /** + * 类型处理器 + */ + private TypeHandler typeHandler; + /** + * jdbc 类型 + */ + private JdbcType jdbcType; + + Null(TypeHandler typeHandler, JdbcType jdbcType) { + this.typeHandler = typeHandler; + this.jdbcType = jdbcType; + } + + public TypeHandler getTypeHandler() { + return typeHandler; + } + + public JdbcType getJdbcType() { + return jdbcType; + } +} diff --git a/docs/spring/cs7802ecec-85e0-11ee-b23a-acde48001122.java b/docs/spring/cs7802ecec-85e0-11ee-b23a-acde48001122.java new file mode 100644 index 00000000..8a13715b --- /dev/null +++ b/docs/spring/cs7802ecec-85e0-11ee-b23a-acde48001122.java @@ -0,0 +1,17 @@ +package org.huifer.rbac.entity.req.resource.btn; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode +public class BtnQueryReq { + private String name; + + private String type; + +}