动态代理示例
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
}