手工编程代理通常涉及以下几个步骤:
定义接口
首先,你需要定义一个或多个接口,这些接口将被代理类实现。例如,你可以定义一个`UserService`接口,包含`addUser`、`updateUser`和`deleteUser`等方法。
创建目标类
接下来,创建一个实现上述接口的目标类。这个类将包含具体的方法实现。例如,`UserServiceImpl`类实现了`UserService`接口。
选择代理方式
动态代理可以通过两种主要方式实现:JDK动态代理和CGLib动态代理。
JDK动态代理:需要实现`InvocationHandler`接口,并重写`invoke()`方法。这种代理方式要求目标类必须实现一个接口。
CGLib动态代理:通过生成目标类的子类来实现代理。这种代理方式不需要目标类实现任何接口,但需要引入CGLib库。
编写代理类
JDK动态代理:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class UserServiceProxy implements InvocationHandler {
private Object target;
public UserServiceProxy(Object target) {
this.target = target;
}
public static Object newProxyInstance(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new UserServiceProxy(target)
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method execution");
Object result = method.invoke(target, args);
System.out.println("After method execution");
return result;
}
}
```
CGLib动态代理:
```java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class UserServiceProxy implements MethodInterceptor {
private Object target;
public UserServiceProxy(Object target) {
this.target = target;
}
public static Object createProxy(Object target) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before method execution");
Object result = method.invoke(target, args);
System.out.println("After method execution");
return result;
}
}
```
使用代理类
JDK动态代理:
```java
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) UserServiceProxy.newProxyInstance(userService);
proxy.addUser();
proxy.updateUser();
proxy.deleteUser();
}
}
```
CGLib动态代理:
```java
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) UserServiceProxy.createProxy(userService);
proxy.addUser();
proxy.updateUser();
proxy.deleteUser();
}
}
```
通过以上步骤,你可以手工创建一个代理类,该代理类可以在调用目标类的方法前后插入自定义的逻辑。选择哪种代理方式取决于你的具体需求和目标类的特性。