Java动态脚本

动态脚本有诸多用途,对于不停机变更执行逻辑,实现部分开放式的业务动态性非常有帮助。不过好的设计需要考虑性能、边界、变更控制等问题,以达到“受控的动态”能力。

JVM提供了不错的脚本接口,从invokedynamicGraalVM,多语言、动态语言、高性能是发展方向。

Groovy作为可以和Java无缝交互的动态语言,利用了invokedynamic来实现核心功能,开发比较活跃,是动态化比较好的选择。下面介绍几种Groovy嵌入Java应用的方法。为达到class缓存、线程安全等目的,一些其他的方法不做介绍。

Java 11升级

Java 11已于2018-09-25发布,作为一个LTS版本,值得重点关注。但从Java 8升级上来还是会碰到不少问题。

1、 project需要增加jaxb依赖,否则编译报错。

Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

增加下面的依赖:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>

Rust错误处理(转)

转自:https://zhuanlan.zhihu.com/p/25506762,修改排版等内容

人孰无过,过而能改,善莫大焉。程序运行过程中总是会出现各种各样的问题,导致程序出现异常或错误,这些异常和错误本身不是 bug,但是如果不处理好的话就会成为 bug。不同编程语言提供了不同的机制来处理错误和异常,一般分为两大类:把错误当作值来处理;抛出异常。

Rust 提供以下基础设施做错误处理:

Option, 
Result,
unwrap, 
expect,
combinators,
try! macro,
Error trait,
From trait,
Carrier trait/Try trait,

Rust 并没有提供基于 exception 的错误处理机制,虽然 panic! 宏在让进程挂掉时也抛出堆栈,同时也可以用 std::panic::catch_unwind 捕捉 panic,但是极其不推荐用来处理常规错误。

Java动态代理应用基础

0、代理的本质

如果把对象间方法的调用理解为client到server之间的通信,那么Proxy的本质是实现一个具有特定功能的中间人。在Java中存在多种方式实现对对象方法调用的代理。

有了中间人之后,就可以对调用进行hook,达到如下目的:

1)控制调用流程,如权限控制、隐藏、监控调用记录等;

2)篡改调用方提供的Request(即Input),如对分布式操作进行Map;

Java多线程与并发基础

1)Thread & ThreadPoolExecutor

Thread例子如下:

for(int i=0; i<100; i++){
    Thread t = new Thread(){
        @Override
        public void run() {
            //job details
        }
    };
    t.start();
    try{ 
        t.join();
    }
    catch(InterruptedException ex){
        ex.printStackTrace();
    }
}

相应的,ThreadPoolExecutor例子如下: