动态代理实现

1. jdk动态代理实现原理

  • 通过实现InvocationHandler接口创建自己的调用处理器
  • 通过Proxy类来指定ClassLoader对象和一组interface来创建动态代理
  • 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型
  • 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数传入
  • jdk动态代理是面向接口的代理模式,如果被代理对象没有实现接口,那jdk动态代理就无能为力

代码实现:

package org.proxy.jdk;

public interface IJob {

	//职位名称
	String position(String positionName);
	//工作内容
	String jobContent(String content);
}
package org.proxy.jdk;

public class Employee implements IJob {

	@Override
	public String position(String positionName) {
		System.out.println("===========当前职位 : "+positionName);
		return positionName;
	}

	@Override
	public String jobContent(String content) {
		System.out.println("==========当前工作内容:"+content);
		return content;
	}
}
package org.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JobProxy implements InvocationHandler {
	private Object target;
	
	public void setTarget(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		return method.invoke(target, args);
	}

    //获取代理对象
	public Object createProxyObject() {
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
}

//测试jdk动态代理
IJob job = new Employee();
JobProxy proxy = new JobProxy();
proxy.setTarget(job);
IJob proxyJob = (IJob) proxy.createProxyObject();
proxyJob.position("Java开发工程师");
proxyJob.jobContent("负责代码编写,架构方案设计。");

2. CGLIB动态代理

  • 通过ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理
  • 因为是生成子类来处理,所以如果代理对象被final修饰的话,会代理失败

代码实现如下:

package org.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGlibProxy implements MethodInterceptor {
	
	public Object createProxyObject(Class<?> clazz) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
		System.out.println("====执行代理,功能增强=====");
		return arg3.invokeSuper(arg0, arg2);
	}

}
//测试cglib代理
CGlibProxy cglibProxy = new CGlibProxy();
Employee employeeProxy = (Employee) cglibProxy.createProxyObject(Employee.class);
employeeProxy.position("测试工程师");
employeeProxy.jobContent("测试开发人员提交的程序");
posted on 2021-05-24 19:26  >^^<  阅读(114)  评论(0)    收藏  举报