java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及实现类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到实现对象上反射执行(
java反射机制学习),在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能。
例子:
package com.hebaijun;
//接口
public interface Image {
public void draw();
}
package com.hebaijun;
//具体实现
public class BigImage implements Image{
@Override
public void draw() {
System.out.println("I am big image!");
}
}
package com.hebaijun;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
// 动态处理方法的调用
public class ImageHandler implements InvocationHandler {
Object object;
public ImageHandler(Object obj){
object = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result;
//可以通过函数名来对不同函数进行不同处理,而不需要每个函数都写一个代理函数。
if (method.getName().equals("draw")) {
System.out.println("Loading image...");
}
//利用反射机制执行具体的方法
result = method.invoke(object, args);
return result;
}
}
package com.hebaijun;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
Image image = new BigImage();
//把具体对象传入处理类
ImageHandler imageHandler = new ImageHandler(image);
//传递对象信息和处理类的对象Proxy类中,newProxyInstance方法使用反射机制动态生成代理对象
Image proxyImage = (Image)Proxy.newProxyInstance(image.getClass().getClassLoader(), image.getClass().getInterfaces(), imageHandler);
//不管代理对象执行什么方法,都会调用imageHandler对象的invoke方法,就是说这个方法监听了所有通过代理调用的方法。
proxyImage.draw();
}
}