-
java.lang.reflect.Proxy; 作用:动态生成代理类和对象。
-
import java.lang.reflect.InvocationHandler; (处理器) 可以通过invoke方法实现对真实角色的访问。
package thread.exmple.dnamicProxy;
/**
* 动态代理: 抽象角色
*/
public interface Star {
/**
* 面谈
*/
void confer();
/**
* 签合同
*/
void sinContract();
/**
* d订票
*/
void bookTicket();
/**
* 唱歌
*/
void sing();
/**
* 收钱
*/
void collectMonry();
}
package thread.exmple.dnamicProxy;
/**
* 真实角色
*/
public class RealStart implements Star {
@Override
public void confer() {
System.err.println("真实角色面谈");
}
@Override
public void sinContract() {
System.err.println("真实角色签合同");
}
@Override
public void bookTicket() {
System.err.println("真实角色订票");
}
@Override
public void sing() {
System.err.println("周杰伦唱歌");
}
@Override
public void collectMonry() {
System.err.println("真实角色收钱");
}
}
package thread.exmple.dnamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 定义处理器StartHandler 控制流程
*/
public class StartHandler implements InvocationHandler {
/**
* 需要处理的真实角色
*/
private Star realStart;
public StartHandler(Star realStart) {
this.realStart = realStart;
}
/**
* 核心方法
* 控制整个代理的流程
*
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object obj = null;
System.err.println("执行前");
System.err.println("需要做的事情1");
System.err.println("需要做的事情2");
System.err.println("需要做的事情3");
obj = method.invoke(realStart, args);
System.err.println("执行后");
System.err.println("需要做的事情1");
System.err.println("需要做的事情2");
System.err.println("需要做的事情3");
return obj;
}
}
package thread.exmple.dnamicProxy;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
Star realStart = new RealStart();
StartHandler startHandler = new StartHandler(realStart);
Star stat = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),new Class[]{Star.class},startHandler);
//只需要明星去唱歌
stat.sing();
}
}