jdk代理分为两类:
1. jdk动态代理
2.jdk静态代理
开始讲jdk动态代理
jdk动态代理分为两种,一种是jdk自带的代理,另一种是spring的cglib代理
先讲jdk自带的代理:代理对象,不需要实现接口
JDK中生成代理对象的API
代理类所在包:java.lang.reflect.Proxy
JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,完整的写法是:
static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h )
package com.study.test.ProxyInstance;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxyInstance {
public static void main(String[] args) {
IStar star = new LiuDeHuaStar();
IStar proxy = (IStar) Proxy.newProxyInstance(
JdkProxyInstance.class.getClassLoader(), //获取当前的类加载器
new Class[]{IStar.class}, //获取代理的接口
new InvocationHandler() { //代理对象的逻辑业务判断
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Double money = (Double) args[0];
if (money > 2000) {
return method.invoke(star, args);
} else {
System.out.println("时间不够,有机会下次合作!");
}
return null;
}
});
proxy.party(100);
proxy.party(10000);
}
}
interface IStar {
void party(double money);
}
class LiuDeHuaStar implements IStar {
@Override
public void party(double money) {
System.out.println("华仔开趴体,气氛很愉悦!");
}
}
小结:
- JDK代理: 目标对象必须实现接口,否则不能使用。
CGLib代理:
package com.study.test.ProxyInstance;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CglibProxyInstance {
public static void main(String[] args) {
IStar01 star = new LiuDeHuaStar01();
IStar01 proxy = (IStar01) Enhancer.create(
LiuDeHuaStar01.class,
new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
// 获取当前执行的方法参数
double money = (double) args[0];
// 判断
if (money > 2000) {
// 调用目标对象的方法
return method.invoke(star, args);
} else {
System.out.println("档期忙,后期再合作!");
}
return null;
}
});
proxy.party(100);
proxy.party(10000);
}
}
interface IStar01 {
void party(double money);
}
class LiuDeHuaStar01 implements IStar01 {
@Override
public void party(double money) {
System.out.println("华仔开趴体,气氛很愉悦!");
}
}
小结
1.cglib代理 也叫做自雷代理,运行时期对目标对象动态生成子类,
2.要求,目标对象不能为final,否则报错,因为生成不了子类
3.目标对象的方法如果为final,static,就不会执行事件处理程序,就不能扩展,会直接执行目标对象的方法
cglib的要求就是上面的,比jdk动态代理要求必须有接口的限制小
静态代理:
package com.study.test.ProxyInstance;
public class ProxyInstance {
public static void main(String[] args) {
IStar02 proxy = new LiuDeHuaProxy();
proxy.party(100);
proxy.party(10000);
}
}
interface IStar02 {
void party(double money);
}
class LiuDeHuaStar02 implements IStar02 {
@Override
public void party(double money) {
System.out.println("华仔开趴体,气氛很愉悦!");
}
}
class LiuDeHuaProxy implements IStar02 {
IStar02 star= new LiuDeHuaStar02();
@Override
public void party(double money) {
if (money>2000){
star.party(2000);
}else {
System.out.println("档期忙,后期再合作!");
}
}
}
静态代理总结:
1.可以做到在不修改目标对象的功能前提下,对目标功能扩展.
2.缺点:
一个目标对象,一个代理对象,导致代理类过多;
代理对象需要与目标对象实现一样的接口,一旦接口增加方法,目标对象与代理对象都要维护.



