最简单的实现方式(直接用引用):
public class ProxyTest {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
//代理类
class Proxy implements Subject{
private RealSubject realSubject;
public void preRequest(){
System.out.println("请求前置处理");
}
public void postRequest(){
System.out.println("请求后置处理");
}
public void request(){
if(realSubject == null){
realSubject = new RealSubject();
}
preRequest();
realSubject.request();
postRequest();
}
}
//抽象主题类
interface Subject {
void request();
}
//真实实现主题类
class RealSubject implements Subject {
public void request(){
System.out.println("我是真实类的request方法");
}
}
第二种:静态代理模式:
//静态代理例子
public class StaticProxyMode {
public static void main(String[] args) {
Singer singer = new Singer();
SingerProxy proxy = new SingerProxy(singer);
proxy.sing();
}
}
//代理类
class SingerProxy{
private ISinger target;
public SingerProxy(ISinger target){
this.target = target;
}
public void sing(){
System.out.println("大家好");
target.sing();
System.out.println("谢谢大家");
}
}
//抽象歌手类
interface ISinger{
public void sing();
}
//真实实现歌手类
class Singer implements ISinger{
public void sing(){
System.out.println("开始唱歌");
}
}
第三种:动态代理模式
public class DynamicProxyMode {
public static void main(String[] args) {
final Singer target = new Singer();
ISinger proxy = (ISinger) Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object [] args){
System.out.println("大家好");
Object returnValue = null;
try {
returnValue = method.invoke(target,args);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println("谢谢大家");
return returnValue;
}
});
proxy.sing();
}
}
//抽象歌手类
interface ISinger{
public void sing();
}
//真实实现歌手类
class Singer implements ISinger{
public void sing(){
System.out.println("开始唱歌");
}
}
第四种:CGlib实现
public class CGlibProxyFactory implements MethodInterceptor {
private Singer singer;
private Enhancer en = new Enhancer();
public CGlibProxyFactory(Singer singer){
this.singer = singer;
}
public Object getProxy(){
en.setSuperclass(singer.getClass());
en.setCallback(this);
return en.create();
}
public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3){
Object obj = null;
try {
System.out.println("开启事务");
obj = arg1.invoke(singer,arg2);
System.out.println("提交事务");
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return obj;
}
public static void main(String[] args) {
Singer singer = new Singer();
CGlibProxyFactory factory = new CGlibProxyFactory(singer);
Singer proxy = (Singer) factory.getProxy();
proxy.sing();
proxy.movie();
}
}
//真实实现歌手类
class Singer{
public void sing(){
System.out.println("开始唱歌");
}
public void movie(){
System.out.println("演电影");
}
}
本文参考:https://www.bilibili.com/video/av53313412?p=18