代理的类必须要继承某个接口
一、静态代理
1:创建用户接口类
package proxy;
/**
* 创建用户接口类
*/
public interface UserInterface {
void printUserName(String name);
}
2:创建用户实现类
package proxy;
/**
* 用户实现类
*/
public class UserService implements UserInterface {
@Override
public void printUserName(String name) {
System.out.println(name);
}
}
3:创建静态代理类
package proxy;
/**
* 静态代理类
*/
public class UserStaticProxy implements UserInterface{
private UserInterface userInterface;
public UserStaticProxy(UserInterface userInterface) {
this.userInterface = userInterface;
}
@Override
public void printUserName(String name) {
System.out.println("前置");
userInterface.printUserName("张三");
System.out.println("后置");
}
}
4:创建测试类
package proxy;
public class TestStatus {
public static void main(String[] args) {
new UserStaticProxy(new UserService()).printUserName("李四");
}
}
二、动态代理类
1:创建用户接口类
package proxy;
/**
* 创建用户接口类
*/
public interface UserInterface {
void printUserName(String name);
}
2:创建用户实现类
package proxy;
/**
* 用户实现类
*/
public class UserService implements UserInterface {
@Override
public void printUserName(String name) {
System.out.println(name);
}
}
3:创建动态代理类
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* 动态代理类
* 实现InvocationHandler调用处理器的invoke方法
*/
public class UserProxy implements InvocationHandler {
/**
* target是传入的实现类
*/
private Object target;
public UserProxy(Object target) {
this.target = target;
}
/**
* @param proxy
* @param method
* @param args
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//里面写业务逻辑
System.out.println("前置");
//返回代理对象
Object invoke = method.invoke(target, args);
System.out.println("后置");
return invoke;
}
}
4:创建测试类
package proxy;
import java.lang.reflect.Proxy;
public class Test {
public static void main(String[] args) {
//实现类对象实例化
UserService userService=new UserService();
//userService.getClass().getClassLoader():获取被代理对象的类加载器,获取被代理对象的接口方法,第三个参数是代理对象
UserInterface userInterface = (UserInterface) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new UserProxy(userService));
//执行方法
userInterface.printUserName("张三");
}
}
三、cglib(如果当前被代理类没有可继承的父类,那么就可以使用cglib进行代理)
1:创建被代理对象
package proxy;
/**
* 被代理对象
*/
public class UserCgLibService {
public void pringUserName(String username) {
System.out.println(username);
}
}
2:创建cglibProxy代理类,中间出了个小问题,methodProxy.invoke(o, objects)的话会导致死循环,所以需要传methodProxy.invoke(target, objects)
package proxy;
import org.springframework.cglib.proxy.*;
import java.lang.reflect.Method;
/**
* 创建cglib动态代理类
* 实现methodInterceptor拦截器
*/
public class CgLibProxy implements MethodInterceptor {
private Object target;
public CgLibProxy(Object target) {
this.target = target;
}
public Object getProxyInstance() {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("前置");
Object invoke = methodProxy.invoke(target, objects);
return invoke;
}
}
3:创建测试类
package proxy;
public class CgLibTest {
public static void main(String[] args) {
UserCgLibService service=new UserCgLibService();
UserCgLibService instance = (UserCgLibService)new CgLibProxy(service).getProxyInstance();
instance.pringUserName("张三");
}
}