根据动态代理的机制,先创建抽象类TargetInterface如下:
public interface TargetInterface
{
public void doSomething();
}
创建目标对象Target实现抽象类如下:
public class Target implements TargetInterface
{
public void doSomething()
{
System.out.println("do something");
}
}
创建拦截器类(只是模拟,只写两个简单的方法)Interceptor如下:
public class Interceptor
{
public void before()
{
System.out.println("before");
}
public void after()
{
System.out.println("after");
}
}
代理类方法执行类MyHandler如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyHandler implements InvocationHandler
{
private Object object;
private Interceptor interceptor = new Interceptor();
public void setObject(Object object)
{
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object result = null;
interceptor.before();
result = method.invoke(object, args);
interceptor.after();
return result;
}
}
代理类MyProxy如下:
import java.lang.reflect.Proxy;
public class MyProxy
{
public Object getProxy(Object object)
{
MyHandler myHandler = new MyHandler();
myHandler.setObject(object);
return Proxy.newProxyInstance(Target.class.getClassLoader(), object
.getClass().getInterfaces(), myHandler);
}
}
最后测试类client如下:
public class Client
{
public static void main(String[] args)
{
TargetInterface target = new Target();
MyProxy myProxy = new MyProxy();
TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);
proxy.doSomething();
}
}
基本工作流程是:在测试类中声明抽象类的对象并且指向目标类的对象,声明一个代理类,调用代理类动态方法getProxy(target)方法,并且把生气的指向目标类的对象作为参数传进来,流程进入到getProxy方法当中如下
public Object getProxy(Object object)
{
MyHandler myHandler = new MyHandler();
myHandler.setObject(object);
return Proxy.newProxyInstance(Target.class.getClassLoader(), object
.getClass().getInterfaces(), myHandler);
}
在方法体内声明了一个代理类的方法执行类的对象myHandler,并调用对象的set方法为对象object即抽象类的对象赋值,然后调用Proxy的newProxyInstance()方法,其中第一个参数被代理类的类加载器,第二个参数是Proxy的newProxyInstance方法返回的对象默认实现第二个参数所代表接口。第三个是方法处理类。当返回的对象调用方法时,会自动调用myHandler的invoke方法,调用myHandler类中的object即抽象类。
分享到:
相关推荐
在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...
下面我们将探讨如何利用Java反射模拟Struts2的工作原理。 首先,Struts2在启动时会读取配置文件,通常是`struts.xml`,该文件定义了各个Action及其对应的处理方法和结果页面。在模拟这个过程时,我们需要创建一个...
实际的Struts框架在DispatcherAction的实现上还考虑了拦截器(Interceptor)、多视图(多个Forward)支持、国际化(Internationalization)等问题,模拟实现时也可以考虑这些增强功能。 通过以上步骤,你可以理解...
总的来说,模拟Struts2环境是学习和理解MVC框架以及Java Web开发的一个良好途径。通过对配置文件的调整和实际代码的编写,开发者可以深入掌握Struts2的工作原理和最佳实践。同时,熟悉反射机制对于理解框架的内部...
b) Struts2的拦截器:Struts2框架中的拦截器(Interceptor)是基于动态代理的,可以对Action调用前后的逻辑进行增强,例如验证用户输入、记录日志等。开发者可以自定义拦截器,通过配置文件决定拦截器链的执行顺序...
**过滤器Filter与Struts2拦截器的区别**: 1. 拦截器基于Java反射,过滤器基于函数回调。 2. 过滤器依赖Servlet容器,拦截器独立。 3. 拦截器作用于Action请求,过滤器作用范围更广。 4. 拦截器可以访问Action上...
在`myStruts1`项目中,你可能已经实现了这些核心组件,并通过编写自定义的Action、FormBean和XML配置文件来模拟Struts的功能。这将帮助你深入理解Struts的工作原理,为今后使用或优化Struts框架打下坚实的基础。此外...
Struts框架是Java Web开发中一个非常重要的MVC(Model-View-Controller)...尽管这种方法在某些场景下是有效的,但随着Struts框架的发展,现在有更好的实践方式来实现相同的功能,比如使用Struts 2的注解和拦截器机制。
- **Struts2拦截器**:学习拦截器的概念及其在Struts2中的应用。 - **文件上传和下载**:实现文件上传和下载功能。 - **Struts2多模块配置**:掌握多模块项目的配置方法。 - **Struts2标签库及OGNL表达式**:学习...
2. **Struts**:Struts作为MVC框架,需要理解其在模型-视图-控制器架构中的角色,以及提供的工具和拦截器等机制。 3. **Tomcat**:掌握Tomcat服务器的基本使用,包括项目的部署方法,了解在非IDE环境下如何操作...
CGlib全称是Code Generation Library,它是一个强大的代码生成库,广泛应用于动态代理和元编程场景。在Java中,当我们需要在运行时创建对象的代理以实现某些功能,比如方法拦截或者性能监控时,CGlib就派上了用场。...
Struts的Action、配置文件、拦截器机制;MyBatis的动态SQL、Mapper接口和XML配置文件。了解这些框架的原理和应用场景,以及如何解决实际问题,将有助于你在面试中脱颖而出。 关于MySQL,你需要熟悉SQL语法,如DML...
- **struts-spring-plugin.jar的内部实现**:该插件通过拦截器来获取Spring容器中的Action对象,并将其传递给Struts2框架处理。 #### 十、Spring的事务管理 - **声明式事务管理(基于配置方式实现事务控制)**:...
\contentsline {chapter}{Contents}{2}{section*.1} {1}Java基础}{17}{chapter.1} {1.1}基本语法}{17}{section.1.1} {1.2}数字表达方式}{17}{section.1.2} {1.3}补码}{19}{section.1.3} {1.3.1}总结}{23}{...
8. **Struts Filter与拦截器**:Filter基于函数回调,依赖于Servlet容器,适用于所有请求;Interceptor基于Java反射,不依赖容器,只对Action请求起作用,可以访问Action上下文和值栈。 9. **抽象工厂方法与工厂...
8. **Struts Filter与拦截器的区别**:Filter基于函数回调,与Servlet容器紧密关联,可处理所有请求,但无法访问Action上下文。Interceptor基于Java反射,不依赖Servlet容器,仅作用于Action请求,能访问Action上...