动态代理示例

 

 

interface AbstractClass {
	public void show();
}

public class ClassA implements AbstractClass{

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("我是A类");
	}

}


public class ClassB implements AbstractClass{
	@Override
	public void show(){
		System.out.println("我是B类");
	}

}


public class Invoker implements InvocationHandler{
	AbstractClass ac;
	
	public Invoker(AbstractClass ac){
		this.ac = ac;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		method.invoke(ac, args);
		System.out.println("代理");
		return null;
	}
	

}


@Test
	public void test(){
		
		Invoker invoker1 = new Invoker(new ClassA());
		AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(), new Class[]{AbstractClass.class}, invoker1);
		ac1.show();
		
		Invoker invoker2 = new Invoker(new ClassB());
		AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(), new Class[]{AbstractClass.class}, invoker2);
		ac2.show();
	}

 

 

主要的操作都在Proxy.newProxyInstance静态方法中,

 

调用

byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

   filepath, a1.getClass().getInterfaces());

会生成实现用户给出的interface和proxy的类的class,

 

调用 

proxyClass = defineClass0(loader, proxyName,

proxyClassFile, 0, proxyClassFile.length);

会将class的字节转为用户的类

 

因为都是native方法,我也就没研究这两个方法是怎么实现的了

 

 

 

可以将proxygenerator输出的字节输出看看

 

String filepath = "fileclass";
		AbstractClass a1 = new ClassA();
		byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
			    filepath, a1.getClass().getInterfaces());
		File f = new File("f:/classes/tempProxy.class");
		try {
			FileOutputStream fos = new FileOutputStream(f);
			fos.write(proxyClassFile);
			fos.flush();
			fos.close();
			System.out.println("finish");
		} catch (Exception e) {
			// TODO: handle exception
		}