- --------------------------------------------申明一个接口 这个是非常重要的---------------------------------------
- publicinterfaceIUser{
- publicvoidaddUser(UserBeanuser);
- publicStringfindUserById(intstuId);
- }
-
------------------------------------------写个类实现这个接口-----------------------------------------------------------
- publicclassUserImplimplementsIUser{
- publicvoidaddUser(UserBeanuser){
- System.out.println("-----------addUser------------");
- }
- publicStringfindUserById(intstuId){
- System.out.println("-----------findUser------------");
- return"Jeson";
- }
- }
---------------------------------------------------------------------------------------------------------------------------------------
下面我要在增和查的方法执行前做权限验证(securityCheck)
但是传统的写法是在调用的方法前写上这个方法 但是每个方法都写 不管是在开发期间还是维护期间都很麻烦
那我们完全可以写个动态代理 为我们的方法实现类创建动态代理 这样无需我们关注一些公共的代码 比如 权限验证啊 日志写入之类的 我们只要关注我们自己的逻辑代码就行了
具体实现如下
------------------------------------------------------创建动态代理----------------------------------------------------------
- publicclassSecurityHandlerimplementsInvocationHandler{
- /*
- InvocationHandler是代理实例的调用处理程序实现的接口。
- 每个代码实例都具有一个关联的调用处理程序。对代理实例调用方法时,将对方法调用进行编码并将其指派到它的调用处理程序的invoke方法。*/
- privateObjectobjectTarget;
- publicObjectgetNewObjectProxy(ObjectobjectTarget)//取得代理类
- {
- this.objectTarget=objectTarget;
- returnProxy.newProxyInstance(objectTarget.getClass().getClassLoader(),objectTarget.getClass().getInterfaces(),this);
- /*
- Proxy
- 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
- newProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)
- 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
- */
- }
- publicObjectinvoke(Objectobject,Methodmethod,Object[]objs)throwsThrowable{
- checkSecurity();
- Objectret=null;//方法调用后的返回值接受变量
- try
- {
- ret=method.invoke(objectTarget,objs);
- }catch(Exceptione)
- {
- e.printStackTrace();
- }
- returnret;
- }
- publicvoidcheckSecurity()
- {
- System.out.println("----------securitychecking---------------");
- }
- }
-------------------------------------------------------测试----------------------------------------------------------
- publicclassDynamicProxy{
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args){
- UserBeanub=newUserBean();
- SecurityHandlerhandler=newSecurityHandler();
- IUseruser=(IUser)handler.getNewObjectProxy(newUserImpl());
- user.findUserById(11);
- }
- }
-----------------------------------------------------------输出-------------------------------------------------
----------security checking---------------
-----------find User------------
本文介绍了一个具体的Java动态代理实现案例,通过定义接口和实现类,再利用动态代理增强方法的安全检查功能,避免了重复代码,提高了开发效率。
1480

被折叠的 条评论
为什么被折叠?



