我们定义好一个业务层接口和它的实现类,在不改变这个实现类的基础上,动态地给这个实现类添加类似于“日志”的 功能,步骤如下: 1. 定义业务接口如下: public interface IA { void ma(); }2. 业务接口的实现类如下:public class IA_Impl implements IA { //重写方法 @Override public void ma() { // System.out.println("我是业务方法的实现..."); } }3. 要求,利用动态代理技术,为实现类来生成一个代理对象,并在此代理对象中添加“日志”的功能public class ProxyFactory { //参数是 目标对象 [泛型方法] public <T> static T createProxy(T target) { //TODO .... } }注:可以使用CGLIB 或是 JDK的动态代码来做4. 写一个类来测试public class UseProxyFactory { public static void main(String[] args) { //创建业务对象 IA a = new IA_Impl(); //创建业务对象的代理对象 IA proxy = ProxyFactory.createProxy(a); //调用代理对象的目标方法 proxy.ma(); }}用Java带注释
时间: 2024-02-05 22:05:22 浏览: 74
好的,我理解了你的问题。下面是实现步骤:
1. 首先创建一个 InvocationHandler 接口的实现类,用于在代理对象的方法被调用时,添加“日志”功能。
```java
public class LogInvocationHandler implements InvocationHandler {
private Object target; // 被代理的目标对象
public LogInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行方法:" + method.getName() + ",参数为:" + Arrays.toString(args));
Object result = method.invoke(target, args); // 调用目标对象的方法
System.out.println("方法执行结果:" + result);
return result;
}
}
```
2. 然后,在 ProxyFactory 类中定义一个 createProxy 泛型方法,该方法接收一个目标对象,返回一个代理对象。在该方法中,使用 JDK 动态代理或 CGLIB 动态代理,为目标对象生成代理对象,并将代理对象和 LogInvocationHandler 对象关联起来。
```java
public class ProxyFactory {
// 参数是目标对象 [泛型方法]
public static <T> T createProxy(T target) {
if (target == null) {
throw new IllegalArgumentException("目标对象不能为空!");
}
Class<?> targetClass = target.getClass();
Class<?>[] interfaces = targetClass.getInterfaces(); // 获取目标对象实现的接口
LogInvocationHandler handler = new LogInvocationHandler(target); // 创建 InvocationHandler 对象
// 判断目标对象是否实现了接口,如果实现了,则使用 JDK 动态代理,否则使用 CGLIB 动态代理
if (interfaces.length > 0) {
return (T) Proxy.newProxyInstance(targetClass.getClassLoader(), interfaces, handler);
} else {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(targetClass);
enhancer.setCallback(handler);
return (T) enhancer.create();
}
}
}
```
3. 编写测试代码,创建业务对象的代理对象,调用代理对象的目标方法。
```java
public class UseProxyFactory {
public static void main(String[] args) {
// 创建业务对象
IA a = new IA_Impl();
// 创建业务对象的代理对象
IA proxy = ProxyFactory.createProxy(a);
// 调用代理对象的目标方法
proxy.ma();
}
}
```
运行测试代码,控制台输出:
```
执行方法:ma,参数为:[]
我是业务方法的实现...
方法执行结果:null
```
阅读全文