java 动态代理示例
时间: 2023-08-31 13:12:33 浏览: 47
Java 动态代理是一种实现 AOP(面向切面编程)的方式,它可以在运行时动态地创建一个代理类,并在代理类中调用被代理对象的方法。下面是一个简单的 Java 动态代理示例:
```java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Animal {
void say();
}
class Dog implements Animal {
@Override
public void say() {
System.out.println("汪汪汪!");
}
}
class AnimalProxy implements InvocationHandler {
private Object target;
public AnimalProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before");
Object result = method.invoke(target, args);
System.out.println("After");
return result;
}
}
public class DynamicProxyDemo {
public static void main(String[] args) {
Animal dog = new Dog();
AnimalProxy proxy = new AnimalProxy(dog);
Animal animalProxy = (Animal) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), proxy);
animalProxy.say();
}
}
```
在这个示例中,我们定义了一个 `Animal` 接口和一个实现该接口的 `Dog` 类。然后,我们创建了一个 `AnimalProxy` 类,它实现了 `InvocationHandler` 接口。在 `invoke` 方法中,我们在调用被代理对象的方法之前和之后打印了一些内容。
在 `main` 方法中,我们首先创建了一个 `Dog` 对象,然后创建了一个 `AnimalProxy` 对象,并将 `Dog` 对象作为参数传递给它。接着,我们使用 `Proxy.newProxyInstance` 方法创建了一个代理对象,并将 `AnimalProxy` 对象和 `Dog` 对象的接口传递给它。最后,我们调用代理对象的 `say` 方法,代理对象会在调用 `Dog` 对象的 `say` 方法之前和之后打印一些内容。
输出结果如下:
```
Before
汪汪汪!
After
```