Java动态代理-代码演示

Java动态代理

  • 动态代理好处
    • 优点简介
    • 代码演示
    • 总结

动态代理好处

优点简介

实现无侵入式的代码扩展;在不用修改业务代码的情况下,增加一些公共扩展;增加代码的可扩展性和灵活性;
废话不多 直接上代码。

代码演示

接口与其实现

package proxy.service;

/**
 * 被代理对象接口
 * @author admin
 *
 */
public interface UserService {
	void eat();
	void speak();
}

package proxy.service.impl;

import proxy.service.UserService;

public class UserServiceImpl implements UserService {

	@Override
	public void eat() {
		System.out.println("吃饭中。。。");
	}

	@Override
	public void speak() {
		System.out.println("说话中。。。");
	}

}

切面类(扩展类)

package proxy.service;

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

/**
 * 切面类 合并代理类
 * @author admin
 *
 */
public class MyRepect implements InvocationHandler{
	
	private UserService us ;

	public MyRepect(UserService us) {
		super();
		this.us = us;
	}

	public void before() {
		System.out.println("前置方法");
	}
	
	public void after() {
		System.out.println("后置方法");
	}

	//获取代理类 之所以要类类加载器参数  是 代理类 动态生成的  并没有class文件
	public Object getUserService() {
		return Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(), this);
	}

	//交织 业务类 和 切面类 
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		before();
		Object ret = method.invoke(us, args);
		after();
		return ret;
	}
}

测试类

package proxy.test;

import proxy.service.MyRepect;
import proxy.service.UserService;
import proxy.service.impl.UserServiceImpl;

public class MainTest {

	public static void main(String[] args) {
		
		//获取被代理对象
		UserService us = new UserServiceImpl();
		MyRepect myRepect = new MyRepect(us);
		UserService userService = (UserService) myRepect.getUserService();
		userService.eat();
	}
}

运行结果:
Java动态代理-代码演示_第1张图片

总结

  1. 使用 java.lang.reflect.Proxy 需要代理对象有接口 不能直接代理实现类;
  2. 动态代理 代理类是在代码运行是生成的 没有对应的class文件;
  3. 它实现了 设计模式 的 装饰者模式

最后如果大家有什么疑问需要讨论 可以给我留言 (`・ω・´)

你可能感兴趣的:(java基础知识)