动态代理中的ProxyFactory是代理类吗,请给出ProxyFactory代码,为什么,请给出代码实例,附带注释和解释
时间: 2024-05-01 19:22:56 浏览: 97
ProxyFactory不是代理类,它是一个用于创建动态代理的工厂类。下面是一个简单的ProxyFactory的代码实例:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyFactory {
/**
* 创建动态代理对象
* @param obj 被代理的对象
* @param handler 代理处理类
* @return 代理对象
*/
public static Object getProxy(Object obj, InvocationHandler handler) {
//通过Proxy类的静态方法newProxyInstance()创建代理对象
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), handler);
}
}
```
上面的代码中,我们使用了Java自带的反射机制,通过调用Proxy类的静态方法newProxyInstance()来创建代理对象。这个方法需要三个参数:
1. ClassLoader对象:用于加载代理类的Class对象。
2. Class[]对象:代理类需要实现的接口列表。
3. InvocationHandler对象:用于代理方法调用的处理类。
接下来我们来看一个示例,假设我们有一个接口UserService和它的实现类UserServiceImpl,现在我们需要使用动态代理来给UserServiceImpl添加一个日志功能,记录每个方法的执行时间。下面是示例代码:
```java
public interface UserService {
void save();
}
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户信息");
}
}
public class LogHandler implements InvocationHandler {
private Object target;
public LogHandler(Object target) {
this.target = target;
}
/**
* 代理方法调用的处理逻辑
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("开始执行方法:" + method.getName());
long start = System.currentTimeMillis();
Object result = method.invoke(target, args);
long end = System.currentTimeMillis();
System.out.println("方法执行结束,耗时:" + (end - start) + "ms");
return result;
}
}
public class Main {
public static void main(String[] args) {
// 创建被代理对象
UserService userService = new UserServiceImpl();
// 创建代理处理类
LogHandler logHandler = new LogHandler(userService);
// 创建代理对象
UserService proxy = (UserService) ProxyFactory.getProxy(userService, logHandler);
// 调用代理方法
proxy.save();
}
}
```
上面的代码中,我们创建了一个LogHandler类作为代理处理类,并在其中实现了代理方法调用的处理逻辑,即在方法执行前打印开始执行的信息,执行后打印执行时间。然后我们创建了一个被代理对象UserServiceImpl和一个代理对象UserService,通过代理对象来调用save()方法,最终实现了在方法执行时记录日志的功能。
阅读全文