java小技巧

  1. 数组创建

    String[] list = {"1","2"}
    new Class<?>[] { xxx.class }
    
  2. 通过反射创建实例(spring)

    BeanUtils.instantiateClass(constructor, args);
    
  3. main方法的入参有什么用

    在运行java程序时,可以传参,使用方法如下:

    1. 启动命令:
      java -jar xxx.jar -Dspring.profiles.active=prod
      
      main方法中能接收到启动参数, 打印如下
          public static void main(String[] args) {
      		 System.out.println(JSON.toJSONString(args));
          }
      
      	["-Dspring.profiles.active=prod"]
      
  4. 函数型接口的使用

    https://blog.csdn.net/Lucifer_Warlock/article/details/120074097

  5. 如何理解tcp的三次握手建立连接和四次挥手断开连接

    可以想象一下 当两个人如何通过 网络延迟为0-1h的微信聊天

  6. controller中出入参类型转换

    枚举类等的自动转换

    @PostMapping("test")
    public void test(@RequestBody UserEntity entity){
        System.out.println(JSON.toJSONString(entity));
        System.out.println(entity.getGender().getCode());
    }
    @Data
    public class UserEntity {
    	private String username;
    	private String password;
    	private SexEnum gender;
    	private StatusEnum status;
    }
    public enum SexEnum {
        Man(1,"男"),
    	Woman(0,"女");
    }
    

    {“username”:“73586”,“password”:“123456”,“gender”: “Man”,“status”: null} 此时能自动转换成对应的枚举类
    原因: springboot 加载时,会加载一些内置的类型转换器

    //加载一些类型转换器,其中就有枚举类和字符串互转的
    DefaultConversionService.addDefaultConverters(registry);
    
    final class StringToEnumConverterFactory implements ConverterFactory<String, Enum> {
    //创建StringToEnum<T extends Enum>的类型转换器
    @Override
    public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
    	return new StringToEnum(ConversionUtils.getEnumType(targetType));
    }
    private static class StringToEnum<T extends Enum> implements Converter<String, T> {
    	private final Class<T> enumType;
    	public StringToEnum(Class<T> enumType) {this.enumType = enumType;}
    	//字符串转成目标类型T的具体方法	
    	@Override
    	public T convert(String source) {
    		if (source.isEmpty()) {
    			// It's an empty enum identifier: reset the enum value to null.
    			return null;
    		}
    		return (T) Enum.valueOf(this.enumType, source.trim());
    	}
    }
    }
    
    //出参转换 枚举类转string
    final class EnumToStringConverter extends AbstractConditionalEnumConverter implements Converter<Enum<?>, String> {
    
    public EnumToStringConverter(ConversionService conversionService) {
    	super(conversionService);
    }
    //会根据枚举类的name进行转换
    @Override
    public String convert(Enum<?> source) {
    	return source.name();
    }
    
    }
    

    自定义类型转换器,待续…

  7. 时区问题

    开发过程中时区问题主要存在于两个地方:

    1. jvm和宿主机之间时区不一致
    2. jvm和mysql的jdbc连接中serverTimeZone不一致
      注意: LocalDateTIme和mysql中的DateTime 都是和时区无关的

    mysql中函数的时区问题
    UNIX_TIMESTAMP( ‘2021-09-08’ )
    应该是和LocalDateTime一样,先转成带时区的时间,然后再转成时间戳
    字符串’2021-09-09’ => 本次session的时区的 2021-09-08(如果是UTC,就是UTC的2021年9月8日) => 其对应的时间戳 (如果这时候你拿着这个时间戳去网站转时间的话,会得到东八区的2021-09-08 08:00)

  8. 延迟消息:

    redis 实现延迟任务(两种方式): 1. 开启redis过期事件(notify-keyspace-events Ex (x key过期并删除时触发事件)), 此种情况依赖redis的删除策略, 2.权重集合,将过期时间作为权重,通过定时任务获取判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值