1.什么是jdk动态代理
Java动态代理可以动态地创建代理并动态地处理对所代理方法的调用。
2.jdk动态代理示例
Jdk动态代理是必须要有接口,所以我们来定义一接口先,步骤如下。
接口:
public interface IPerson {
public void doWork();
}
被代理类:
public class Person implements IPerson {
@Override
public void doWork() {
System.out.println("要做的工作");
}
}
第一种方式实现动态代理(实现 InvocationHandler接口):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PersonProxy implements InvocationHandler {
private Person person = new Person();
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("之前做的操作");
method.invoke(person, args);
System.out.println("之后做的操作");
return null;
}
}
测试类的编写:
import java.lang.reflect.Proxy;
import org.junit.Test;
public class TestProxy {
@Test
public void testProsy() throws Exception {
Person person = new Person();
IPerson personPrxy = (IPerson) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass()
.getInterfaces(), new PersonProxy());
personPrxy.doWork();
}
}
输出结果:
之前的工作
要做的工作
之后的工作
第二种实现方式(使用匿名内部类来实现):
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class PersonProxy2 {
Person person = new Person();
@SuppressWarnings("unchecked")
public <T> T getProxyObject() {
//用泛型返回代理对象
return (T) Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("之前的工作");
person.doWork();
System.out.println("之后的工作");
return null;
}
});
}
}
测试代码:
import org.junit.Test;
public class TestProxy2 {
@Test
public void testProsy2() throws Exception {
IPerson personProxy = new PersonProxy2().getProxyObject();
personProxy.doWork();
}
}
输出结果:
之前的工作
要做的工作
之后的工作