面试题答案
一键面试代理对象创建过程
- 定义接口:首先定义一个接口,目标类需要实现该接口。例如:
public interface UserService {
void addUser();
}
- 实现接口的目标类:
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("添加用户");
}
}
- 创建InvocationHandler实现类:实现
InvocationHandler
接口,并重写invoke
方法。在invoke
方法中,会调用目标方法并添加日志记录逻辑。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class LoggingInvocationHandler implements InvocationHandler {
private Object target;
public LoggingInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 记录日志:方法调用前
System.out.println("开始调用方法 " + method.getName());
Object result = method.invoke(target, args);
// 记录日志:方法调用后
System.out.println("方法 " + method.getName() + " 调用结束");
return result;
}
}
- 创建代理对象:使用
Proxy
类的newProxyInstance
方法创建代理对象。
import java.lang.reflect.Proxy;
public class ProxyFactory {
public static Object createProxy(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new LoggingInvocationHandler(target)
);
}
}
在代理方法中添加日志记录代码
在LoggingInvocationHandler
类的invoke
方法中添加日志记录代码。如上述代码中,在调用目标方法method.invoke(target, args)
之前,输出“开始调用方法 [方法名]”;在调用目标方法之后,输出“方法 [方法名] 调用结束”。这样就实现了在代理方法执行前后记录日志,从而实现AOP编程中的日志记录功能。
使用示例:
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
UserService proxy = (UserService) ProxyFactory.createProxy(userService);
proxy.addUser();
}
}
当调用代理对象的addUser
方法时,就会触发日志记录。