JDK动态代理实现

时间:2022-08-27 18:46:03

创建一个实现类的接口,因为动态代理的本质其实就是代理接口

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();

}

}

//测试结果:

  在调用真实对象的方法前,执行的方法逻辑!
  这是真实对象的方法!
  在调用真实对象的方法后,执行的方法逻辑。