目录
1、静态代理
UserProxy类:
public class UserProxy implements UserService{
private UserService userService=new UserServiceImpl();
@Override
public void dance() {
System.out.println("安排场地");
System.out.println("时间:");
userService.dance();
System.out.println("结束");
}
}
UserService类:
public class UserServiceImpl implements UserService{
@Override
public void dance() {
System.out.println("边唱歌边跳舞");
}
}
UserProxyImpl类:
public class UserServiceImpl implements UserService{
@Override
public void dance() {
System.out.println("边唱歌边跳舞");
}
}
测试:
public class Test1 {
public static void main(String[] args) {
//测试静态代理
UserService userService=new UserProxy();
userService.dance();
}
}
2、jdk动态代理和cglib动态代理的区别
1、CGLIB代理和JDK代理都是Java中的动态代理技术。
2、JDK代理只能对实现了接口的类生成代理对象,而CGLIB代理可以对实现了接口的类以及没有实现接口的类生成代理对象。 JDK代理是通过反射实现的,因此生成代理对象的速度比CGLIB代理要慢一些。
3、CGLIB代理则是通过生成被代理类的子类来实现的,因此生成代理对象的速度比JDK代理要快,但是由于需要生成子类,因此在实际应用中对内存的消耗会比JDK代理要大一些。
4、JDK代理只能代理实现了接口的类,而且生成的代理对象的类型是接口类型。而CGLIB代理可以代理没有实现接口的类,生成的代理对象的类型是被代理类的子类。
3、jdk动态代理
UserService类:
public interface UserService {
void dance();
}
UserServiceImpl类:
public class UserServiceImpl implements UserService{
@Override
public void dance() {
System.out.println("边唱歌边跳舞");
}
}
Test:
public class Test2 {
//动态代理
public static void main(String[] args) {
// Object target=new Object();
UserServiceImpl target=new UserServiceImpl();
//动态生成一个代理对象
UserService proxy1= (UserService) Proxy.newProxyInstance(
target.getClass().getClassLoader(), //获取目标对象对应的类加载器
target.getClass().getInterfaces(),//获取目标对象实现的接口数组
// 方法调用处理器:拦截到对目标方法的调用
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("扩充的功能111");
//调用目标方法
Object result=method.invoke(target,args);
System.out.println("扩充的功能222");
return result;
}
}
);
proxy1.dance();
}
}
4、cglib动态代理
CglibProxy类:
public class CglibProxy {
private Object target;
public CglibProxy(Object target) {
this.target = target;
}
public Object getProxy(){
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// System.out.println(o);
// System.out.println(method);
// System.out.println(objects);
// System.out.println(methodProxy);
// System.out.println("测试");
System.out.println("扩充新功能...");
// 调用目标方法并返回结果
Object result= methodProxy.invoke(target,objects);
return result;
}
});
return enhancer.create();
}
}
StudentService类:
public class StudentService {
public String study(String content){
System.out.println("学习"+content);
return "好";
}
}
Test类:
public class Test6 {
public static void main(String[] args) {
StudentService service=new StudentService();
StudentService proxy= (StudentService) new CglibProxy(service).getProxy();
String result= proxy.study("代理模式");
System.out.println(result);
}
}