深入理解JVM10-类加载及执行子系统的案例和实战

深入理解JVM-类加载及执行子系统的案例和实战

在class文件格式和执行引擎这部分中,用户的程序能直接影响的内容并不太多,class文件以何种格式存储,类型何时加载,苏和连接。以及虚拟机如何执行字节码指令都是由虚拟机直接控制的行为。用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成和类加载器这两部分的功能。

在本文中,介绍了类加载器和字节码的案例各两个。

1.Tomact正统的类加载器架构

深入理解JVM10-类加载及执行子系统的案例和实战_第1张图片

2.动态代理

动态代理中所谓的动态,是针对使用java代码实际编写了代理类的静态代理而言的,他的优势不在于省去了便携代理类的那一点工作量,而是实现了可以在原始类和接口为知的情况下,就确定代理类的代理行为。当代理类和原始类脱离直接联系后,就可以很灵活的重用于不同的应用场景中。

package jv;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyTest {
    interface Ihello{
        void sayHello();
    }
    
    static class Hello implements Ihello{
        public void sayHello(){
            System.out.println("hello world");
        }
    }
    static class DynamicProxy implements InvocationHandler{
        Object originalObj;
        
        Object bind(Object originalObj){
            this.originalObj=originalObj;
            return Proxy.newProxyInstance(originalObj.getClass().getClassLoader(), originalObj.getClass().getInterfaces(), this);
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("welcome");
            return method.invoke(originalObj, args);
        }
        
        public static void main(String[] args) {
            Ihello hello =(Ihello) new DynamicProxy().bind(new Hello());
            hello.sayHello();
        }
    }
}
welcome
hello world

你可能感兴趣的:(深入理解JVM10-类加载及执行子系统的案例和实战)