代理模式


代理模式: 给某个对象提供一个代理,由代理对象来控制原对象的引用
subject : 代理和真实对象共有的接口
realSubject:  真实的对象
proxy : 代理对象,里面包含真实对象的引用,可以在执行真实对象操作的基础上附加其他操作,相当于对真实对象进行封装

有了代理模式之后,就相当于我们可以在调用真实对象的前后进行增强处理

动态代理

动态代理和静态代理的区别,就是静态代理的代理类是提前写好的,但是动态代理是程序运行时生成的
public class ProxyTest {
	
	public static void main(String[] args) {
		Person  lin = new Student("lin");
		InvocationHandler studentHandler = new StuInvocationHandler<Person>(lin);
		Person st*** = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[] {Person.class}, studentHandler);
		st***.giveTask();
	}

}

public class StuInvocationHandler<T> implements InvocationHandler{
	
	T target;
	public StuInvocationHandler(T target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("代理执行"+ method.getName() + "方法");
		Object result = method.invoke(target, args);
		return result;
	}

}

JDK动态代理和 CGLIB动态代理区别

使用CGLIB实现动态代理,底层是使用ASM字节码生成代理类,会比java反射的效率要高,唯一要注意的是,cglib方式不能代理final方法,因为cglib的原理是生成被代理类的子类
所以如果被代理类实现了接口使用JDK,没实现接口使用CGLIB

  • JDK动态代理类实现了InvocationHandler接口,重写的invoke方法。
  • JDK动态代理的基础是反射机制(method.invoke(对象,参数))Proxy.newProxyInstance()
cglib原理是对指定的目标生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理