静态代理:编译期就能确定代理类的类型,动态代理:运行期间"动态"确定代理类的类型,代理类和被代理类需要实现相同的接口
静态代理举例:
/**
* @Auther: zxt
* @Date: 2019/12/24 14:58
* @Description:
*/
interface Sign{
void sign();
}
class LiuDeHua implements Sign{
@Override
public void sign() {
System.out.println("liu de hua sign");
}
}
class JingjiRen implements Sign{
private Sign liuDeHua;
public JingjiRen(Sign liuDeHua) {
this.liuDeHua = liuDeHua;
}
@Override
public void sign() {
System.out.println("===准备场地====");
liuDeHua.sign();
System.out.println("===安排下一场地==");
}
}
public class StaticFactoryTest {
public static void main(String[] args) {
Sign sign = new LiuDeHua();
Sign proxySign = new JingjiRen(sign);
proxySign.sign();
}
}
执行结果:
===准备场地====
liu de hua sign
===安排下一场地==
动态代理举例:
/**
* @Auther: zxt
* @Date: 2019/12/24 15:05
* @Description: 动态代理
*/
class DynamicFacotry{
private Object object;//真实的被代理类
private InvocationHandler handler;
public DynamicFacotry(Object object, InvocationHandler handler) {
this.object = object;
this.handler = handler;
}
public static Object getInstance(Object object, InvocationHandler handler){
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);
}
}
public class DynamicFactoryTest {
public static void main(String[] args) {
final Sign sign = new LiuDeHua();
Sign proxy = (Sign) DynamicFacotry.getInstance(sign, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("===动态代理start======");
Object obj = method.invoke(sign);
System.out.println("====动态代理end==========");
return obj;
}
});
proxy.sign();
}
}
执行结果:
===动态代理start======
liu de hua sign
====动态代理end==========