前置
- jdk的代理的是接口的方法 ,所以被代理的要有方法
InvocationHandler
调用处理器,被代理的类方法调用时会使用其中的invoke
方法
优缺点
使用简单, 适合非单例模式(启动快运行慢)
- 会通过反射获取接口
- 再用反射生成新的对象
- 最后 invoke 调用方法
- 是不是不适合单例模式呢
public interface Hello {
void sayhello();
}
public class HelloImpl implements Hello{
@Override
public void sayhello() {
System.out.println("Hello World");
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object object;
public MyInvocationHandler(Object target) {
super();
this.object = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy start");
method.invoke(object,args);
System.out.println("proxy after");
return null;
}
}
public class MyInvocationHandler implements InvocationHandler {
private Object object;
public MyInvocationHandler(Object target) {
super();
this.object = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("proxy start");
method.invoke(object,args);
System.out.println("proxy after");
return null;
}
}
```java
public class JdkProxy {
public static void main(String[] args) {
HelloImpl hello = new HelloImpl();
MyInvocationHandler handler = new MyInvocationHandler(hello);
Hello o = (Hello) Proxy.newProxyInstance(HelloImpl.class.getClassLoader(),
HelloImpl.class.getInterfaces(),
handler
);
o.sayhello();
}
}
运行效果:
- 这是使用代理
- 这是不使用代理