动态代理——方法增强

一、方法增强三种方式

		** 第一种 继承:要知道父类
		** 第二种 装饰者模式:
			*** 两个类实现相同的接口,得到另一类的引用
			*** 缺点:需要把接口里面的所有的方法都实现

		** 第三种 动态代理
			*** 比如移动总部,和各地的代理商例子
			*** 通过类 Proxy里面方法是 
			*** newProxyInstance(TestProxy02.class.getClassLoader(), interfaces, new MyInvocationHand())可以创建接口的代理的实现类。
			//三个参数:
			/*
			 * 第一个参数:类加载器
			 * 第二个参数:生成实现类的接口
			 * 第三个参数:增强接口里面的方法,
			 * 实现逻辑写在里面 使用接口里面的方法 invoke(Object proxy, Method method, Object[] args) 
			 * */

 二、Demo.java

package com.ayit.dynamicproxy;

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

/**
 * 子类继承父类实现方法的增强
 * 
 * 接口实现类实现方法的增强,用增强类构造传递实现类的引用——装饰者模式
 *
 * 接口动态代理,获取同级实现类,使用类Proxy实现Perso接口的方法的增强,invoke指定方法增强通过参数mothod类实现——动态代理
 * @author XiaYuJia
 *
 */
public class DynamicProxy {
	public static void main(String[] args) {
		Class[] interfaces = {Person.class};
		Person per = (Person) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(),interfaces, new MyInvocationHandler());
		per.eat();
	}
}

class MyInvocationHandler implements InvocationHandler{

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("200-----------------");
		return null;
	}
	
}

interface Person{
	public void eat();
}

class Lucy implements Person{
	@Override
	public void eat() {
		System.out.println("1000----------------");
	}
}

三、HttpServletRequest通用编码处理getParameter方法增强

package com.ayit.dynamicproxy;

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

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * request里面方法有很多 -首先进行方法判断,是否为getParameter -判断提交方式。进行相应处理
 * 
 * @author XiaYuJia
 * 
 */
@WebFilter(urlPatterns = "/*")
public class MyHttpServletRequest implements Filter {
	@SuppressWarnings("all")
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		
		//强制类型转换,匿名内部类使用需要final修饰
		final HttpServletRequest request = (HttpServletRequest) req;
		
		//动态代理实现接口方法增强
		Class[] interfaces = { HttpServletRequest.class };
		//proxy三个参数:类加载器,接口类,调用处理内部类
		HttpServletRequest myreq = (HttpServletRequest) Proxy.newProxyInstance(
				MyHttpServletRequest.class.getClassLoader(), interfaces,
				new InvocationHandler() {
					
					//方法实现
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {
						// 判断方法名为getParameter
						if ("getParameter".equalsIgnoreCase(method.getName())) {
							// 获取提交的方式Post,Get
							String mtd = request.getMethod();
							if ("GET".equalsIgnoreCase(mtd)) {
								String s = (String) method
										.invoke(request, args);
								s = new String(s.getBytes("ISO-8859-1"),
										"UTF-8");
								return s;
							} else if ("POST".equalsIgnoreCase(mtd)) {
								request.setCharacterEncoding("UTF-8");
							}
						}
						return method.invoke(request, args);
					}
				});
		chain.doFilter(myreq, resp);
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}

	@Override
	public void destroy() {
	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值