静态代理,动态代理,Cglib代理详解

一.静态代理

新建一个接口 定义一个玩家方法:

 

package com."".proxy.staticc;

public interface Iplayer {
public void play();
}

 

  建一个你自己玩游戏的类

package com."".proxy.staticc;

public class YourPlayer implements Iplayer {

	public void play() {
		System.out.println("登录");
		System.out.println("刷图中======");
		System.out.println("刷图中======");
		System.out.println("刷图中======");
		System.out.println("退出");
		
	}

}

  建立代理类

package com."".proxy.staticc;

public class DaLiPlayer implements Iplayer{
private  Iplayer player = new YourPlayer();

public DaLiPlayer(Iplayer player){
    this.player = player;
}
    
    
    //环绕通知
    public void play() {
        System.out.println("代练");//前置通知
        player.play();
        System.out.println("还号");//后置通知
    }

}

开始代理玩游戏

package com."".proxy.staticc;

public class Client {
public static void main(String[] args) {
	//传递玩家账号
	YourPlayer yourPlayer = new YourPlayer();
	
	//找到代理人
	DaLiPlayer daLiPlayer = new DaLiPlayer(yourPlayer);
	
	//开始玩游戏
	daLiPlayer.play();
}
}

  

二.动态代理

动态代理的方法和静态比较类似 只是可以动态的代理目标 这里展示下具体代码

package com."".jdkproxy;

public interface Iplayer {
	
	String name = "123";

	public abstract void play();
	
}

  

package com."".jdkproxy;

public class DnfPlayer implements Iplayer {

	public void play() {
		
		System.out.println("我只玩DNF,把你们负责人叫出来!");
	}

	
}

  

package com."".jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyPlay  implements InvocationHandler{
	private Object targetObject = new Object();
	
	public Object createProxy(Object targetObject){
		this.targetObject = targetObject;
	return	Proxy.newProxyInstance(
			targetObject.getClass().getClassLoader(), 
			targetObject.getClass().getInterfaces(), 
			this);
	}
	
	
	

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("前置代理");
		Object obj = method.invoke(targetObject, args);
				System.out.println("后置代理");
		
		return obj;
	}

}

  

package com."".jdkproxy;

public class Test {
public static void main(String[] args) {
	
//获得需求的玩家
	Iplayer player = new DnfPlayer();
	
	//找对应的代理对象
	ProxyPlay proxy = new ProxyPlay();
	
	//执行代练方法
	Iplayer pl = (Iplayer) proxy.createProxy(player);
	
	pl.play();
	
	
	//魔兽玩家
	WowPlayer wow = new WowPlayer();
	Iplayer pl2 = (Iplayer) proxy.createProxy(wow);
	pl2.play();
	
		
}
}

  三.Cglib代理详解

package com."".cglibproxy;

public interface IPlayer {
public void play();
}
package com."".cglibproxy;

public class DNFPlayer implements IPlayer{

	public void play() {
		System.out.println("我只玩DNF 给我找个代练");
		
	}

}

  

package com."".cglibproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
//cglib代理
public class ProxyHome implements MethodInterceptor{
    private Object tarObject;
    
    public Object createCglib(Object tarObject){
        this.tarObject = tarObject;
        
        Enhancer enhancer = new Enhancer();
        enhancer.setClassLoader(tarObject.getClass().getClassLoader());
        enhancer.setInterfaces(tarObject.getClass().getInterfaces());
        enhancer.setCallback(this);
        
        
        
        
        return enhancer.create();
        
    }
    
    

    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy arg3) throws Throwable {
        System.out.println("给你登录代练开始");
Object object = method.invoke(tarObject, args);

System.out.println("给你退出代练结束");
        
        return object;
    }
    
    
    

}
package com."".cglibproxy;

public class Test {
public static void main(String[] args) {
    IPlayer p2 = new  DNFPlayer();
    
    ProxyHome proxy = new ProxyHome();
    
    IPlayer tp = (IPlayer) proxy.createCglib(p2);
    tp.play();
    
}
}

 

posted @ 2018-04-18 23:23  城南少年与猫  阅读(202)  评论(0编辑  收藏  举报