意义:生成一个代理对象,来代理真实对象,从而控制其真实对象的访问。在真实对象访问之前或者之后,加入你想要的逻辑代码,起到增强功能的作用。
步骤
提供一个接口Iphone.java
,和接口的实现类PhoneImpl.java
:
public interface Iphone {
public void product5S();
public void product6S();
}
public class PhoneImpl implements Iphone {
@Override
public void product5S() {
System.out.println("生产iPhone 5S中");
}
@Override
public void product6S() {
System.out.println("生产iPhone 6S中");
}
}
提供一个代理类JdbcProxy.java
,要实现java.lang.reflect.InvocationHandler
接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdbcProxy implements InvocationHandler{
//真实对象
private Object target=null;
//建立真实对象与代理对象之间的关系,这个地方是在调用的时候,给真实对象target赋值,为invoke调用
public Object bind(Object target) {
this.target=target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
//代理逻辑
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用 "+method.getName()+" 方法之前");
Object obj = method.invoke(target, args);//相当于调用真实对象的方法
System.out.println("调用 "+method.getName()+" 方法之后");
return obj;
}
}
写一个测试类Test.java
public class Test {
public static void main(String[] args) {
JdbcProxy jdk=new JdbcProxy();
Iphone proxy=(Iphone)jdk.bind(new PhoneImpl());//注意,这个地方要强转成接口
proxy.product5S();
System.out.println("");
proxy.product6S();
}
}
测试结果
调用 product5S 方法之前
生产iPhone 5S中
调用 product5S 方法之后
调用 product6S 方法之前
生产iPhone 6S中
调用 product6S 方法之后