手工编程代理怎么做的

时间:2025-01-24 22:13:11 游戏攻略

手工编程代理通常涉及以下几个步骤:

定义接口

首先,你需要定义一个或多个接口,这些接口将被代理类实现。例如,你可以定义一个`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();

}

}

```

通过以上步骤,你可以手工创建一个代理类,该代理类可以在调用目标类的方法前后插入自定义的逻辑。选择哪种代理方式取决于你的具体需求和目标类的特性。