接口和实现类:
package dongtaidaili;
public interface Interface {
void doSomething();
void somethingElse(String arg);
}
package dongtaidaili;
public class RealObject implements Interface{
@Override
public void doSomething() {
System.out.println("开火车.....");
}
@Override
public void somethingElse(String arg) {
System.out.println("开汽车.... " + arg);
}
}
动态代理对象处理器
package dongtaidaili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicProxyHandler implements InvocationHandler{
private Object proxyed;//代理对象
public DynamicProxyHandler(Object proxyed) {
this.proxyed = proxyed;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("代理工作了.");
return method.invoke(proxyed, args);
}
}
测试类:
package dongtaidaili;
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
//初始化一个实际对象
RealObject real = new RealObject();
//实例化接口对象
Interface proxy = (Interface) Proxy.newProxyInstance(
Interface.class.getClassLoader(), new Class[] {Interface.class},
new DynamicProxyHandler(real));
proxy.doSomething();
proxy.somethingElse("ooooppp");
//代理类通过调用Proxy静态方法Proxy.newProxyInstance()可以创建动态代理,
// 这个方法需要得到
// 1.一个类加载器,
// 2.一个你希望该代理实现的接口列表(不是类或抽象类)
// 3.以及InvocationHandler的一个实现类。
// 动态代理可以将所有调用重定向到调用处理器,因此通常会调用处理器的构造器传递一个”实际”对象的引用,
// 从而将调用处理器在执行中介任务时,将请求转发。
}
}
打印运行结果:
代理工作了.
开火车.....
代理工作了.
开汽车.... ooooppp