1 概念
代理:代理模式 23种设计模式之一
通过代理对象实现对被代理对象的功能进行增强和扩展
类似于:代理商 中介
代理对象:房屋中介
被代理对象:买房/卖房
原则:代理对象不能比被代理对象更多的功能
使用:使用场景:日志信息 权限管理 流量统计 异常处理...
2 静态代理
好处:易于理解
坏处:通用性差::只能代理指定接口的实现类
public class Demo01StaticProxy {
public static void main(String[] args) {
Student01 ss=new Student01("韩梅梅",11);
Student01Proxy sproxy=new Student01Proxy(ss);
sproxy.hehe();
System.out.println(" -------------");
System.out.println("结果="+sproxy.add(1, 2));
}
}
interface Student01Inter{
public void hehe();
public int add(int a,int b);
}
class Student01Proxy implements Student01Inter{
private Student01Inter s;
public Student01Proxy(Student01 s) {this.s = s;}
public void hehe() {
System.out.println(s+"的hehe方法要被调用前:");
s.hehe();
System.out.println(s+"的hehe方法要被调用后:");
}
public int add(int a, int b) {
System.out.println(s+"的add方法要被调用前:");
int result=s.add(a,b);
System.out.println(s+"的add方法要被调用后:");
return result;
}
}
class Student01 implements Student01Inter{
private String name;
private int age;
public Student01(String name, int age) {
this.name = name;
this.age = age;
}
public void hehe(){
System.out.println("我是student01::"+name+":"+age);
}
public int add(int a,int b){
System.out.println("计算:"+a+"+"+b);
return a+b;
}
}
3 动态代理/jdk代理
通过jdk的Proxy类的api 在运行时:动态的创建一个被代理对象的接口的实现类对象
优点:一个代理工厂类为任意被代理对象创建代理类对象
缺点:但被代理对象必须实现接口
public class Demo02DynamicProxy {
public static void main(String[] args) {
Student02 s2=new Student02("韩梅梅", 12);
Teacher02 t2=new Teacher02();
ProxyFactory02 p2=new ProxyFactory02();
p2.setTarget(s2);
Student02Inter proxy2=(Student02Inter)p2.newInstance();
proxy2.hehe();
System.out.println(" -------------");
System.out.println("结果="+proxy2.add(1, 2));
System.out.println(" -------------");
p2.setTarget(t2);
Teacher02Inter proxyt2=(Teacher02Inter)p2.newInstance();
proxyt2.show();
}
}
class Student02 implements Student02Inter{
private String name;
private int age;
public Student02(String name, int age) {
this.name = name;
this.age = age;
}
public void hehe(){
System.out.println("我是student02::"+name+":"+age);
}
public int add(int a,int b){
System.out.println("我是student02::计算:"+a+"+"+b);
return a+b;
}
}
interface Student02Inter{
public void hehe();
public int add(int a,int b);
}
interface Teacher02Inter{
public void show();
}
class Teacher02 implements Teacher02Inter{
public void show(){
System.out.println("show方法:::");
}
}
class ProxyFactory02 implements InvocationHandler{
private Object obj;
public void setTarget(Object obj) {
this.obj = obj;
}
public Object newInstance(){
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(obj+"的方法名是:"+method.getName()+",参数列表是:"+Arrays.toString(args)+"::方法被调用前!");
Object result=method.invoke(obj, args);
System.out.println(obj+"的方法名是:"+method.getName()+",参数列表是:"+Arrays.toString(args)+"::方法被调用后!");
return result;
}
}
4 cglib代理
通过spring的cglib的jar包来实现动态代理::在运行时 创建一个被代理对象的子类对象
要求:被代理对象类不能是fianl即可
package com.zhiyou100.demo014_proxy;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class Demo03CglibProxy {
public static void main(String[] args) {
Student03 s3=new Student03("呵呵", 14);
Teacher03 t3=new Teacher03();
ProxyFactroy03 proxyFactroy03=new ProxyFactroy03();
proxyFactroy03.setTarget(s3);
Student03 proxy31=(Student03)proxyFactroy03.newInstance();
proxy31.hehe();
System.out.println(" -------------");
System.out.println("结果="+proxy31.add(1, 2));
System.out.println(" -------------");
proxyFactroy03.setTarget(t3);
Teacher03 proxy32=(Teacher03)proxyFactroy03.newInstance();
proxy32.show();
}
}
class Student03{
private String name;
private int age;
public Student03(String name, int age) {this.name = name;this.age = age;}
public void hehe(){
System.out.println("我是student02::"+name+":"+age);
}
public int add(int a,int b){
System.out.println("我是student02::计算:"+a+"+"+b);
return a+b;
}
public Student03() {}
}
class Teacher03 implements Teacher02Inter{
public void show(){
System.out.println("show方法:::");
}
}
class ProxyFactroy03 implements MethodInterceptor{
private Object target;
public void setTarget(Object obj){
this.target=obj;
}
public Object newInstance(){
Enhancer en = new Enhancer();
en.setSuperclass(target.getClass());
en.setCallback(this);
return en.create();
}
public Object intercept(Object arg0, Method method, Object[] arg2, MethodProxy arg3) throws Throwable {
System.out.println(target+"的方法名是:"+method.getName()+",参数列表是:"+Arrays.toString(arg2)+"::方法被调用前!");
Object result=method.invoke(target, arg2);
System.out.println(target+"的方法名是:"+method.getName()+",参数列表是:"+Arrays.toString(arg2)+"::方法被调用后!");
System.out.println("arg3.getSuperName()::"+arg3.getSuperName());
return result;
}
}