From f226b8418a51dbb25579fe1fcbaa3bbbcfaf3ada Mon Sep 17 00:00:00 2001 From: Looly Date: Sun, 23 Apr 2023 00:05:39 +0800 Subject: [PATCH] fix code --- .travis.yml | 3 +- .../core/annotation/AnnotationProxy.java | 3 +- .../core/annotation/AnnotationUtil.java | 3 +- .../hutool/core/reflect/ReflectUtil.java | 19 +++++- .../org/dromara/hutool/core/util/ObjUtil.java | 25 +++++-- .../core/annotation/AnnotationUtilTest.java | 5 ++ .../hutool/core/func/LambdaUtilTest.java | 11 ++-- .../extra/spring/cglib/CglibUtilTest.java | 3 + .../engine/jdk/HttpUrlConnectionUtil.java | 29 +++++--- .../client/HttpUrlConnectionUtilTest.java | 2 +- .../org/dromara/hutool/swing/img/ImgUtil.java | 66 ++++++++----------- 11 files changed, 103 insertions(+), 66 deletions(-) diff --git a/.travis.yml b/.travis.yml index e81da583a..040bd788a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,7 @@ install: true jdk: - openjdk8 + - openjdk17 notifications: email: false @@ -14,7 +15,7 @@ cache: directories: - '$HOME/.m2' -script: +script: - export TZ=Asia/Shanghai - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V - mvn cobertura:cobertura -Dcobertura.report.format=xml -Dmaven.javadoc.skip.true diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationProxy.java b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationProxy.java index 009694141..55632ae9c 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationProxy.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationProxy.java @@ -83,7 +83,8 @@ public class AnnotationProxy implements Annotation, Invoca * @return 属性(方法结果)映射 */ private Map initAttributes() { - final Method[] methods = MethodUtil.getMethods(this.type); + // 只缓存注解定义的方法 + final Method[] methods = MethodUtil.getDeclaredMethods(this.type); final Map attributes = new HashMap<>(methods.length, 1); for (final Method method : methods) { diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationUtil.java index 0a19dc95d..2dd1f5e44 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/annotation/AnnotationUtil.java @@ -324,7 +324,8 @@ public class AnnotationUtil { } /** - * 设置新的注解的属性(字段)值 + * 设置新的注解的属性(字段)值
+ * 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 * * @param annotation 注解对象 * @param annotationField 注解属性(字段)名称 diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/ReflectUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/ReflectUtil.java index 3edc14af5..018d899e8 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/reflect/ReflectUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/reflect/ReflectUtil.java @@ -37,6 +37,24 @@ import java.lang.reflect.*; */ public class ReflectUtil { + /** + * 设置方法为可访问(私有方法可以被外部调用),静默调用,抛出异常则跳过
+ * 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 + * + * @param AccessibleObject的子类,比如Class、Method、Field等 + * @param accessibleObject 可设置访问权限的对象,比如Class、Method、Field等 + * @return 被设置可访问的对象 + * @throws SecurityException 访问被禁止抛出此异常 + */ + public static T setAccessibleQuietly(final T accessibleObject) { + try{ + setAccessible(accessibleObject); + } catch (final RuntimeException ignore){ + // ignore + } + return accessibleObject; + } + /** * 设置方法为可访问(私有方法可以被外部调用)
* 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 @@ -50,7 +68,6 @@ public class ReflectUtil { public static T setAccessible(final T accessibleObject) throws SecurityException { if (null != accessibleObject && !accessibleObject.isAccessible()) { accessibleObject.setAccessible(true); - return accessibleObject; } return accessibleObject; } diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/util/ObjUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/util/ObjUtil.java index d8cb4030a..ed12b2107 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/util/ObjUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/util/ObjUtil.java @@ -361,15 +361,26 @@ public class ObjUtil { * @see #cloneByStream(Object) */ public static T clone(final T obj) { - T result = ArrayUtil.clone(obj); - if (null == result) { - if (obj instanceof Cloneable) { - result = MethodUtil.invoke(obj, "clone"); - } else { - result = cloneByStream(obj); + final T result = ArrayUtil.clone(obj); + if(null != result){ + // 数组 + return result; + } + + if (obj instanceof Cloneable) { + try{ + return MethodUtil.invoke(obj, "clone"); + } catch (final HutoolException e){ + if(e.getCause() instanceof IllegalAccessException){ + // JDK9+下可能无权限 + return cloneByStream(obj); + }else { + throw e; + } } } - return result; + + return cloneByStream(obj); } /** diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/annotation/AnnotationUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/annotation/AnnotationUtilTest.java index c0db59601..c35d3780d 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/annotation/AnnotationUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/annotation/AnnotationUtilTest.java @@ -5,6 +5,8 @@ import org.dromara.hutool.core.util.ObjUtil; import lombok.SneakyThrows; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import java.lang.annotation.*; import java.lang.reflect.Method; @@ -113,7 +115,9 @@ public class AnnotationUtilTest { } @Test + @EnabledForJreRange(max = JRE.JAVA_8) public void testSetValue() { + // jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 final AnnotationForTest annotation = ClassForTest.class.getAnnotation(AnnotationForTest.class); final String newValue = "is a new value"; Assertions.assertNotEquals(newValue, annotation.value()); @@ -124,6 +128,7 @@ public class AnnotationUtilTest { @Test public void testGetAnnotationAlias() { final MetaAnnotationForTest annotation = AnnotationUtil.getAnnotationAlias(AnnotationForTest.class, MetaAnnotationForTest.class); + Assertions.assertNotNull(annotation); Assertions.assertEquals(annotation.value(), annotation.alias()); Assertions.assertEquals(MetaAnnotationForTest.class, annotation.annotationType()); } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/func/LambdaUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/func/LambdaUtilTest.java index e4313d5d9..5b318bfd1 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/func/LambdaUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/func/LambdaUtilTest.java @@ -20,6 +20,8 @@ import org.dromara.hutool.core.lang.tuple.Tuple; import org.dromara.hutool.core.reflect.MethodUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; import java.io.Serializable; import java.lang.reflect.Method; @@ -181,17 +183,16 @@ public class LambdaUtilTest { final BiConsumer setId = LambdaUtil.buildSetter(MethodUtil.getMethod(Bean.class, "setId", Long.class)); final BiConsumer setId2 = LambdaUtil.buildSetter(Bean.class, Bean.Fields.id); - final BiConsumer setFlag = LambdaUtil.buildSetter(Bean.class, Bean.Fields.flag); Assertions.assertEquals(setId, setId2); setId.accept(bean, 3L); - setFlag.accept(bean, true); Assertions.assertEquals(3L, (long) bean.getId()); - Assertions.assertTrue(bean.isFlag()); } @Test - void buildSetterTest() { + @EnabledForJreRange(max = JRE.JAVA_8) + void buildSetterWithPrimitiveTest() { + // 原始类型参数在jdk9+中构建setter异常 final Bean bean = new Bean(); bean.setId(2L); bean.setFlag(false); @@ -339,7 +340,7 @@ public class LambdaUtilTest { @Test void getInvokeMethodErrorTest() { // 非函数接口返回异常 - Assertions.assertThrows(IllegalArgumentException.class, ()->{ + Assertions.assertThrows(IllegalArgumentException.class, () -> { LambdaUtil.getInvokeMethod(LambdaUtilTest.class); }); } diff --git a/hutool-extra/src/test/java/org/dromara/hutool/extra/spring/cglib/CglibUtilTest.java b/hutool-extra/src/test/java/org/dromara/hutool/extra/spring/cglib/CglibUtilTest.java index c7f62ec59..ff4a6923f 100644 --- a/hutool-extra/src/test/java/org/dromara/hutool/extra/spring/cglib/CglibUtilTest.java +++ b/hutool-extra/src/test/java/org/dromara/hutool/extra/spring/cglib/CglibUtilTest.java @@ -16,10 +16,13 @@ import lombok.Data; import org.dromara.hutool.core.convert.Convert; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledForJreRange; +import org.junit.jupiter.api.condition.JRE; public class CglibUtilTest { @Test + @EnabledForJreRange(max = JRE.JAVA_8) public void copyTest() { final SampleBean bean = new SampleBean(); OtherSampleBean otherBean = new OtherSampleBean(); diff --git a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/HttpUrlConnectionUtil.java b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/HttpUrlConnectionUtil.java index ce7c1a75e..40c7fcad3 100644 --- a/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/HttpUrlConnectionUtil.java +++ b/hutool-http/src/main/java/org/dromara/hutool/http/client/engine/jdk/HttpUrlConnectionUtil.java @@ -12,10 +12,10 @@ package org.dromara.hutool.http.client.engine.jdk; +import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.io.IORuntimeException; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.reflect.ModifierUtil; -import org.dromara.hutool.core.array.ArrayUtil; import org.dromara.hutool.core.util.SystemUtil; import org.dromara.hutool.http.HttpException; @@ -26,8 +26,6 @@ import java.net.HttpURLConnection; import java.net.Proxy; import java.net.URL; import java.net.URLConnection; -import java.security.AccessController; -import java.security.PrivilegedAction; /** * 针对{@link HttpURLConnection}相关工具 @@ -44,23 +42,34 @@ public class HttpUrlConnectionUtil { /** * 增加支持的METHOD方法
* 此方法通过注入方式修改{@link HttpURLConnection}中的methods静态属性,增加PATCH方法
- * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch + * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch */ - public static void allowPatch() { - AccessController.doPrivileged((PrivilegedAction) () -> { - doAllowPatch(); - return null; - }); + public static void allowPatchQuietly() { + try{ + allowPatch(); + } catch (final Exception ignore){ + // ignore + } } /** * 增加支持的METHOD方法
* 此方法通过注入方式修改{@link HttpURLConnection}中的methods静态属性,增加PATCH方法
- * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch + * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch + */ + public static void allowPatch() { + doAllowPatch(); + } + + /** + * 增加支持的METHOD方法
+ * 此方法通过注入方式修改{@link HttpURLConnection}中的methods静态属性,增加PATCH方法
+ * see: https://stackoverflow.com/questions/25163131/httpurlconnection-invalid-http-method-patch * * @since 5.7.4 */ synchronized private static void doAllowPatch() { + // 注意此方法在jdk9+中抛出异常,须添加`--add-opens=java.base/java.lang=ALL-UNNAMED`启动参数 final Field methodsField = FieldUtil.getField(HttpURLConnection.class, "methods"); if (null == methodsField) { throw new HttpException("None static field [methods] with Java version: [{}]", SystemUtil.get("java.version")); diff --git a/hutool-http/src/test/java/org/dromara/hutool/http/client/HttpUrlConnectionUtilTest.java b/hutool-http/src/test/java/org/dromara/hutool/http/client/HttpUrlConnectionUtilTest.java index fa6fc1792..979900801 100644 --- a/hutool-http/src/test/java/org/dromara/hutool/http/client/HttpUrlConnectionUtilTest.java +++ b/hutool-http/src/test/java/org/dromara/hutool/http/client/HttpUrlConnectionUtilTest.java @@ -6,6 +6,6 @@ import org.junit.jupiter.api.Test; public class HttpUrlConnectionUtilTest { @Test public void allowPatchTest() { - HttpUrlConnectionUtil.allowPatch(); + HttpUrlConnectionUtil.allowPatchQuietly(); } } diff --git a/hutool-swing/src/main/java/org/dromara/hutool/swing/img/ImgUtil.java b/hutool-swing/src/main/java/org/dromara/hutool/swing/img/ImgUtil.java index cc9c7669b..cd3ca455c 100644 --- a/hutool-swing/src/main/java/org/dromara/hutool/swing/img/ImgUtil.java +++ b/hutool-swing/src/main/java/org/dromara/hutool/swing/img/ImgUtil.java @@ -197,9 +197,9 @@ public class ImgUtil { */ public static void scale(final File srcImageFile, final File destImageFile, final int width, final int height, final Color fixedColor) throws IORuntimeException { Img.from(srcImageFile)// - .setTargetImageType(FileNameUtil.extName(destImageFile))// - .scale(width, height, fixedColor)// - .write(destImageFile); + .setTargetImageType(FileNameUtil.extName(destImageFile))// + .scale(width, height, fixedColor)// + .write(destImageFile); } /** @@ -1201,8 +1201,8 @@ public class ImgUtil { */ public static BufferedImage toBufferedImage(final Image image, final String imageType, final Color backgroundColor) { final int type = IMAGE_TYPE_PNG.equalsIgnoreCase(imageType) - ? BufferedImage.TYPE_INT_ARGB - : BufferedImage.TYPE_INT_RGB; + ? BufferedImage.TYPE_INT_ARGB + : BufferedImage.TYPE_INT_RGB; return toBufferedImage(image, type, backgroundColor); } @@ -1295,13 +1295,15 @@ public class ImgUtil { // issue#1821@Github img = new ImageIcon(img).getImage(); - final BufferedImage bimage = new BufferedImage( - img.getWidth(null), img.getHeight(null), imageType); - final Graphics2D bGr = GraphicsUtil.createGraphics(bimage, backgroundColor); + final BufferedImage bImage = new BufferedImage( + img.getWidth(null), + img.getHeight(null), + imageType); + final Graphics2D bGr = GraphicsUtil.createGraphics(bImage, backgroundColor); bGr.drawImage(img, 0, 0, null); bGr.dispose(); - return bimage; + return bImage; } /** @@ -1348,8 +1350,8 @@ public class ImgUtil { */ public static String toBase64DataUri(final Image image, final String imageType) { return URLUtil.getDataUri( - "image/" + imageType, "base64", - toBase64(image, imageType)); + "image/" + imageType, "base64", + toBase64(image, imageType)); } /** @@ -1464,9 +1466,9 @@ public class ImgUtil { */ public static Rectangle2D getRectangle(final String str, final Font font) { return font.getStringBounds(str, - new FontRenderContext(AffineTransform.getScaleInstance(1, 1), - false, - false)); + new FontRenderContext(AffineTransform.getScaleInstance(1, 1), + false, + false)); } // region ----- write @@ -1571,50 +1573,36 @@ public class ImgUtil { write(image, imageType, destImageStream, 1); } - /** - * 写出图像为指定格式 - * - * @param image {@link Image} - * @param imageType 图片类型(图片扩展名) - * @param targetImageStream 写出到的目标流 - * @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩 - * @throws IORuntimeException IO异常 - * @since 4.3.2 - */ - public static void write(final Image image, final String imageType, final ImageOutputStream targetImageStream, - final float quality) throws IORuntimeException { - write(image, imageType, targetImageStream, quality, null); - } - /** * 写出图像为指定格式 * * @param image {@link Image} * @param imageType 图片类型(图片扩展名),{@code null}表示使用RGB模式(JPG) - * @param destImageStream 写出到的目标流 + * @param out 写出到的目标流 * @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩 * @param backgroundColor 背景色{@link Color} * @throws IORuntimeException IO异常 * @since 4.3.2 */ - public static void write(final Image image, final String imageType, final ImageOutputStream destImageStream, + public static void write(final Image image, final String imageType, final ImageOutputStream out, final float quality, final Color backgroundColor) throws IORuntimeException { final BufferedImage bufferedImage = toBufferedImage(image, imageType, backgroundColor); - write(bufferedImage, destImageStream, quality); + write(bufferedImage, imageType, out, quality); } /** * 通过{@link ImageWriter}写出图片到输出流 * * @param image 图片 + * @param imageType 图片类型 * @param output 输出的Image流{@link ImageOutputStream} * @param quality 质量,数字为0~1(不包括0和1)表示质量压缩比,除此数字外设置表示不压缩 * @since 4.3.2 */ - public static void write(final Image image, final ImageOutputStream output, final float quality) { - ImgWriter.of(image, null) - .setQuality(quality) - .write(output); + public static void write(final Image image, final String imageType, final ImageOutputStream output, final float quality) { + ImgWriter.of(image, imageType) + .setQuality(quality) + .write(output); } /** @@ -1882,8 +1870,8 @@ public class ImgUtil { */ public static Point getPointBaseCentre(final Rectangle rectangle, final int backgroundWidth, final int backgroundHeight) { return new Point( - rectangle.x + (Math.abs(backgroundWidth - rectangle.width) / 2), // - rectangle.y + (Math.abs(backgroundHeight - rectangle.height) / 2)// + rectangle.x + (Math.abs(backgroundWidth - rectangle.width) / 2), // + rectangle.y + (Math.abs(backgroundHeight - rectangle.height) / 2)// ); } // endregion @@ -2032,7 +2020,7 @@ public class ImgUtil { */ public static Image filter(final ImageFilter filter, final Image image) { return Toolkit.getDefaultToolkit().createImage( - new FilteredImageSource(image.getSource(), filter)); + new FilteredImageSource(image.getSource(), filter)); } // endregion }