深入理解JVM-类加载及执行子系统的案例和实战
在class文件格式和执行引擎这部分中,用户的程序能直接影响的内容并不太多,class文件以何种格式存储,类型何时加载,苏和连接。以及虚拟机如何执行字节码指令都是由虚拟机直接控制的行为。用户程序无法对其进行改变。能通过程序进行操作的,主要是字节码生成和类加载器这两部分的功能。
在本文中,介绍了类加载器和字节码的案例各两个。
1.Tomact正统的类加载器架构
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