=======================================静态代理==============================
package Proxy.StaticProxy;
/**
* 静态代理
* @author DMW
* @2019年1月17日
*/
public class Main {
/**
* 可用于,某个方法,某个服务,只负责主要任务
* 但是在这之前,需要一些提前准备,这样可以使用代理,
* 由代理把之前的准备工作做完,主要任务由主要服务做
*/
/**
* 需要
* 1.interface ---->一个接口,规定这个业务的整体业务,包括主业务和前置任务
* 2.service ---->一个类,实现interface,此类负责主要任务,前置任务不用管
* 3.proxy ---->一个类,实现interface,有一个service属性,构造方法需要传这个service,
* 此类完成 前置任务,主要任务由属性service完成
*/
public static void main(String[] args) {
ProxyInterface beProxy =new BeProxyed();
ProxyInterface proxy =new Proxy(beProxy);
proxy.doSomething1();
proxy.doSomething2();
proxy.proxyMethod();
}
}
package Proxy.StaticProxy;
/**
* 被代理的类
*/
public class BeProxyed implements ProxyInterface{
@Override
public void doSomething1() {
System.out.println("我是被代理类,doSomething1不是我该做的");
}
@Override
public void doSomething2() {
System.out.println("我是被代理类,doSomething2不是我该做的");
}
@Override
public void proxyMethod() {
System.out.println("我是被代理类,proxyMethod是我应该做的");
}
}
package Proxy.StaticProxy;
/**
* 代理接口
* @author DMW
* @2019年1月17日
*/
public interface ProxyInterface {
//代理类执行的方法
void doSomething1();
void doSomething2();
//需要被代理类执行的方法
void proxyMethod();
}
package Proxy.StaticProxy;
/**
* 代理类
* @author DMW
* @2019年1月17日
*/
public class Proxy implements ProxyInterface{
private ProxyInterface proxyed;
public Proxy(ProxyInterface proxyed) {
super();
this.proxyed = proxyed;
}
@Override
public void doSomething1() {
System.out.println("代理人做的doSomething1");
}
@Override
public void doSomething2() {
System.out.println("代理人做的doSomething2");
}
@Override
public void proxyMethod() {
proxyed.proxyMethod();
}
}
==================================JDK动态代理===================================
package Proxy.JDKDynamicProxy;
import java.lang.reflect.Proxy;
/**
* 利用JDK动态代理-(只可对接口进行代理)
* @author DMW
* @2019年1月17日
*/
public class Main {
/**
* 相对于静态代理,处理类不需要实现代理接口,也就不用实现接口,
* 而且被代理的类不是写死的,可以在运行时根据不同的类进行动态的代理。
*/
/**
* 需要
*
* java.lang.reflect.Proxy ,代理类
* java.lang.reflect.InvocationHandler,代理执行接口
*
* Proxy 反射生成代理类,执行代理方法
* InvocationHandler 实现其invoke方法,通过此方法执行代理方法,可在此方法内进行额外操作等
*/
public static void main(String[] args) {
//被代理类
ProxyInterface beProxy= new BeProxyed();
//代理处理类
ProxyHandlar handlar =new ProxyHandlar(beProxy);
//通过jdk
ProxyInterface proxy=(ProxyInterface)Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{ProxyInterface.class}, handlar);
proxy.proxyMethod();
}
}
package Proxy.JDKDynamicProxy;
/**
* 被代理的类
*/
public class BeProxyed implements ProxyInterface{
@Override
public void proxyMethod() {
System.out.println("我是被代理类,proxyMethod是我应该做的");
}
}
package Proxy.JDKDynamicProxy;
/**
* 代理接口
* @author DMW
* @2019年1月17日
*/
public interface ProxyInterface {
//需要被代理类执行的方法
void proxyMethod();
}
package Proxy.JDKDynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 代理处理类
* @author DMW
* @2019年1月17日
*/
public class ProxyHandlar implements InvocationHandler{
//被代理的类
private ProxyInterface proxyInterface;
public ProxyHandlar(ProxyInterface proxyInterface) {
super();
this.proxyInterface = proxyInterface;
}
/**
* 核心的方法
*
* proxy 代理类
* method 代理方法
* args 代理方法参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("我可以做别的了");
//执行被代理的方法
method.invoke(proxyInterface, args);
System.out.println("我已经收尾了");
return null;
}
}
======================================CGLB动态代理========================
package Proxy.CGLBDynamicProxy;
import net.sf.cglib.proxy.Enhancer;
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(BeProxyed.class);
enhancer.setCallback(new Proxy());
BeProxyed proxy=(BeProxyed)enhancer.create();
proxy.proxyMethod();
}
}
package Proxy.CGLBDynamicProxy;
/**
* 被代理的类
*/
public class BeProxyed {
public void proxyMethod() {
System.out.println("我是被代理类,proxyMethod是我应该做的");
}
}
package Proxy.CGLBDynamicProxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class Proxy implements MethodInterceptor{
/**核心方法
* sub 代理对象
* methodProxy 代理方法
* objects 方法参数
* method 被代理方法
*/
@Override
public Object intercept(Object sub, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("我开始做别的事了");
//代理执行方法
methodProxy.invoke(sub, objects);
System.out.println("我完事了");
return null;
}
}