Proxy代理模式是一种结构设计模式。主要是解决直接访问对象所带来的问题。
代理,分为动态代理和静态代理。
Subject : 抽象接口
RealSubject:抽象接口的实现类
Proxy:代理类,实现Subject。持有RealSubject对象的实例,其中所有的方法都是调用 RealSubject 来实现。
Proxy 代理类因为是通过调用 RealSubject 来实现,所以就可以在 RealSubject 的方法调用之前以及之后做一些事情,也就是所谓的面向切面编程(AOP)。
静态代理,顾名思意,所要代理类是直接编写在Java代码中的,在编译时就已经固定下来。而动态代理,则是在运行时才实际生成代理类。
JDK 动态代理示例代码:
package com.java.test.jvm;
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 {
@Override
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();
}
}