一.jdk动态代理(只能代理实现了接口的类)
1.通过:java.lang.reflect.Proxy类来生成动态代理对象
2.代理类需要实现java.lang.reflect.InvocationHandler接口
3.只能用于基于接口实现的动态代理
二.代码
1.动态代理接口:InterfaceObject.java:
package jdk.dynamic.proxy;
//代理接口,最终通过此接口调用动态生成的代理类实现
public interface InterfaceObject {
public String targetMethod(String str);
public String targetMethod2(String str);
}
2.目标类:TargetObject.java (实现动态代理接口)
package jdk.dynamic.proxy;
//目标类
public class TargetObject implements InterfaceObject{
//方法1
@Override
public String targetMethod(String str) {
System.out.println("目标对象的方法1");
return str;
}
//方法2
@Override
public String targetMethod2(String str) {
System.out.println("目标对象的方法2");
return str;
}
}
3.自定义实现InvocationHandler接口的类:MyInvocationHandler.java
package jdk.dynamic.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//实现InvocationHandler以便Proxy动态生成代理类
public class MyInvocationHandler implements InvocationHandler{
//目标类
private TargetObject targetObject;
public MyInvocationHandler(TargetObject targetObject){
this.targetObject = targetObject;
}
//重写invoke方法,Proxy动态生成代理类的时候会调用此方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("前置:before");
Object result = null;
try {
//使用方法反射调用目标对象方法
result = method.invoke(targetObject, args);
System.out.println("返回通知:AfterReturning");
} catch (Exception e) {
System.out.println("异常通知:AfterThrowing");
}finally{
System.out.println("后置通知:After1");
}
System.out.println("后置通知:After2");
return result;
}
}
4.测试main方法:
package jdk.dynamic.proxy;
import java.lang.reflect.Proxy;
//测试类
public class UseExec {
public static void main(String[] args) {
//通过java.lang.reflect.Proxy类来生成动态代理对象
//Proxy.newProxyInstance(当前类加载器, 动态代理接口的数组, 代理类);
//当前类加载器
ClassLoader classLoader = UseExec.class.getClassLoader();
//动态代理类 的Class对象数组
Class[] classes = {InterfaceObject.class};
//实现InvocationHandler的自定义类
MyInvocationHandler myInvocationHandler = new MyInvocationHandler(new TargetObject());
//动态生成代理类(动态代理接口的实现类)
InterfaceObject interfaceObject = (InterfaceObject) Proxy.newProxyInstance(classLoader, classes, myInvocationHandler);
//调用动态代理类的接口
interfaceObject.targetMethod("你好");
interfaceObject.targetMethod2("你好2");
}
}
运行结果:
前置:before
目标对象的方法1
返回通知:AfterReturning
后置通知:After1
后置通知:After2
前置:before
目标对象的方法2
返回通知:AfterReturning
后置通知:After1
后置通知:After2
可见,jdk动态代理,无论目标对象的方法有多少,代理对象始终只通过一个invoke方法动态生成所有代理方法!