创建一个实现类的接口,因为动态代理的本质其实就是代理接口
package com.xiawei.reflect.jdkproxy;
public interface JavaClassDao {
public void say();
}===========================================
实现上面的借口
package com.xiawei.reflect.jdkproxy;
public class JavaClassDaoImpl implements JavaClassDao{
@Override
public void say() { System.out.println("这是真实对象的方法!"); }}
===========================================
创建动态代理类,并让其实现 java.lang.reflect.InvocationHandler接口
package com.xiawei.reflect.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class JdkProxyClass implements InvocationHandler {
//定义一个真实对 private Object target; //创建真实对象与代理对象的代理关系,并返回代理对象 public Object bind(Object target){ this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //代理方法逻辑 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在代理方法逻辑中,可以在调用真实对象的方法前执行需要的方法逻辑 System.out.println("在调用真实对象的方法前,执行的方法逻辑!"); //调用真实对象的方法 Object object = method.invoke(target, args);//通过反射执行目标对象的方法[这里相当于target.] //在代理方法逻辑中,可以在调用真实对象的方法后执行需要的方法逻辑 System.out.println("在调用真实对象的方法后,执行的方法逻辑。"); //在这里,如果调用的真实对象没有返回值,则object为null,否则返回调用对象方法的返回结果 return object; }}
===========================================
package com.xiawei.reflect.jdkproxy;
public class Test {
public static void main(String[] args) {
//要调用真实类的方法,就要先创建 代理类对象 JdkProxyClass jpc = new JdkProxyClass(); //然后通过代理类对象的bind()方法获得代理对象(即:绑定关系,因为挂在接口JavaClassDao下面) //所以申明代理对象JavaClassDao proxy JavaClassDao proxy = (JavaClassDao) jpc.bind(new JavaClassDaoImpl()); //通过代理对象调用真实类的方法 proxy.say();}
}
//测试结果:
在调用真实对象的方法前,执行的方法逻辑!
这是真实对象的方法! 在调用真实对象的方法后,执行的方法逻辑。