静态代理和动态代理异同
- 静态代理和动态代理,被代理的类和代理类都实现了相同的接口
- 静态代理,代理类是在编译的时候就已经确认了的
- 动态代理,代理类是在运行的时候通过被代理类动态生成的
- 动态代理涉及到的类:Proxy.newProxyInstance、InvocationHandler
静态代理
package com.hhc.proxy;
interface Sing {
void sing();
}
class Singer implements Sing {
@Override
public void sing() {
System.out.println("歌手在唱歌");
}
}
class Broker implements Sing {
private Sing sing;
public Broker(Sing sing) {
this.sing = sing;
}
@Override
public void sing() {
System.out.println("经纪人布置场景");
sing.sing();
System.out.println("经纪人收拾场景");
}
}
public class StaticProxyTest {
public static void main(String[] args) {
Sing singer = new Singer();
Sing broker = new Broker(singer);
broker.sing();
}
}
动态代理
package com.hhc.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Human {
void eat();
}
class SuperMan implements Human {
@Override
public void eat() {
System.out.println("超人喜欢吃甜甜圈");
}
}
class ProxyFactory {
public static Object getProxyInstance(Object obj) {
MyInvocationHandler handler = new MyInvocationHandler();
handler.bind(obj);
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
}
}
class MyInvocationHandler implements InvocationHandler {
private Object object;
public void bind(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用方法之前记录日志入参日志:" + args);
Object returnObject = method.invoke(object, args);
System.out.println("调用方法之后记录日志出参日志:" + returnObject);
return returnObject;
}
}
public class ProxyTest {
public static void main(String[] args) {
Human human = new SuperMan();
Human proxySuperMan = (Human) ProxyFactory.getProxyInstance(human);
proxySuperMan.eat();
Sing sing = new Singer();
Sing proxySinger = (Sing)ProxyFactory.getProxyInstance(sing);
proxySinger.sing();
}
}