java中方法增强的三种方式

更新时间:2023-06-15 22:49:08 阅读: 评论:0

java中⽅法增强的三种⽅式  * ⼀种⽅式:继承的⽅式.
* 能够控制这个类的构造的时候,才可以使⽤继承.
    Connection是⼀个接⼝,实现类不确定(由各⼚商提供),⽆法使⽤此⽅法
* ⼆种⽅式:装饰者模式⽅式.
* 包装对象和被包装的对象都要实现相同的接⼝.
* 包装的对象中需要获得到被包装对象的引⽤.
***** 缺点:如果接⼝的⽅法⽐较多,增强其中的某个⽅法.其他的功能的⽅法需要原有调⽤.
* 三种⽅式:动态代理的⽅式.
* 被增强的对象实现接⼝就可以.
⼀继承:
class Man{
public void run(){
System.out.println("跑....");
能量传递效率}
}
class SuperMan extends Man{
五行缺木怎么办public void run(){
// super.run();
System.out.println("飞....");
}
}
o型血阳性⼆装饰者模式(典型案例 HttpServletRequest 解决全局乱码问题)
public class EncodingFilter implements Filter{
@Override
public void doFilter(ServletRequest request, ServletRespon respon, FilterChain chain)
throws IOException, ServletException {
//request.tCharacterEncoding("UTF-8");
//在传递request之前对request的getParameter⽅法进⾏增强
/*
* 装饰者模式(包装)
* 1、增强类与被增强的类要实现统⼀接⼝
* 2、在增强类中传⼊被增强的类
* 3、需要增强的⽅法重写不需要增强的⽅法调⽤被增强对象的
*/
//被增强的对象
HttpServletRequest req = (HttpServletRequest) request;
//增强对象
EnhanceRequest enhanceRequest = new EnhanceRequest(req);
chain.doFilter(enhanceRequest, respon);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
class EnhanceRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public EnhanceRequest(HttpServletRequest request) {
super(request);
}
//对getParaameter增强
@Override
医院设备科
public String getParameter(String name) {
String parameter = Parameter(name);//乱码
try {
parameter = new Bytes("iso8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return parameter;
}
}
三动态代理
接⼝类:Waiter
public interface Waiter {
public void rve();
public String sayhello();
}
实现类:Waitress
public class Waitress implements Waiter {
@Override
我的母亲和舅妈
public void rve() {
System.out.println("您要点⼉什么呢?");
}
@Override
public String sayhello() {
System.out.println("hello world");
return null;
}
什么奶粉好
}
代理类:ProxyDemo
public class ProxyDemo {
@Test
public void strengthen(){
//获得要增强实现类的对象
final Waiter waiter = new Waitress();
/*
* Proxy为代理类。
* newProxyInstance为Proxy的静态⽅法,此⽅法⽤于实现动态代理
* 返回值为增强类要实现的接⼝对象
* 此⽅法需要接受三个参数:类加载器、被增强类所要实现的全部接⼝、处理类
*
*/
//类加载器
ClassLoader classLoader = Class().getClassLoader();
//被增强类所要实现的全部接⼝
Class<?>[] interfaces = Class().getInterfaces();
//处理类⼀般是通过创建匿名内部类来实现的。
Waiter waiterProxy = (wProxyInstance(classLoader, interfaces, new InvocationHandler() {  /*
* proxy:产⽣的代理对象的引⽤
* method:当前正在调⽤的⽬标类的⽅法
* params:只在执⾏的⽅法中的参数。
*/
//需要注意的是我们⽆论调⽤waiterProxy中的任何⽅法都会执⾏invoke。所以我们可以在invoke中做⼀个判断,            //从⽽只执⾏我们想要的⽅法。
@Override
public Object invoke(Object proxy, Method method, Object[] params) throws Throwable {
//根据⽅法名来执⾏我们需求中的⽅法。
瘦肚腩
if("rve".Name())){
System.out.println("欢迎光临");
//这⾥我们使⽤了method的invoke来执⾏waiterProxy中的⽅法。
Object object = method.invoke(waiter, params);
System.out.println("谢谢光临");
return object;
}el{
//只执⾏了原来的⽅法,没有进⾏增强。
Object object = method.invoke(waiter, params);
return object;
}
}
});
waiterProxy.rve();
//waiterProxy.sayhello();
}
}
>岁月无常

本文发布于:2023-06-15 22:49:08,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1040268.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:增强   实现   对象   需要
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图