- 浏览: 114673 次
- 性别:
- 来自: 广西
文章分类
最新评论
-
greemqqran:
这方法 源码,是怎么的哦?
可变参数,数组与集合之间的转换 -
greemqqran:
Arrays.asList
可变参数,数组与集合之间的转换 -
ricoyu:
引用? super E:接收的是E类型对象应该是: ? sup ...
泛型-
动态代理+注解实现用户权限控制
- 博客分类:
- j2se
首先第一步我们需要定义一个接口UserDao
package cn.dhcool.proxy.auth; public interface UserDao { @Auth("admit") public abstract void addUser(); @Auth("admit") public abstract void delUser(); @Auth("admit") public abstract User findUser(); @Auth("admit,user") public abstract void updataUser(); }
一个实现类UserDaoImp
package cn.dhcool.proxy.auth; public class UserDaoImp implements UserDao { @Auth("admit") public void addUser(){ System.out.println("add"); } @Auth("admit") public void delUser(){ System.out.println("delUser"); } @Auth("admit") public User findUser(){ System.out.println("findUser"); return null; } @Auth("admit,user") public void updataUser(){ System.out.println("updataUser"); } }
基本用户权限Domain: User
package cn.dhcool.proxy.auth; public class User { private String userName; private String role; public User() { } public User(String userName, String role) { this.userName = userName; this.role = role; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } }
用于获取动态代理类的工具类 : ProxyClass
package cn.dhcool.proxy.auth; import java.lang.reflect.Proxy; public class ProxyClass { //真实对象 private Object realObject; private User user; public ProxyClass(Object realObject,User user) { this.realObject = realObject; this.user = user; } public Object newProxyInstance(){ return Proxy.newProxyInstance(this.realObject.getClass().getClassLoader(), this.realObject.getClass().getInterfaces(),new MyInvocationHandler(realObject,user)); } }
注解的定义:Auth
package cn.dhcool.proxy.auth; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Auth { public String value(); }
接口回调:MyInvocationHandler
package cn.dhcool.proxy.auth; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler{ private Object realObject; private User user; public MyInvocationHandler(Object realObject,User user){ this.realObject = realObject; this.user = user; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { String role = user.getRole(); //获取代理类调用的方法名 String methodName = method.getName(); //反射获取真实类的方法 Method realMethod = this.realObject.getClass().getMethod(methodName,method.getParameterTypes()); //判断真实的方法是否有注解 if(realMethod.isAnnotationPresent(Auth.class)){ Auth auth = realMethod.getAnnotation(Auth.class); String[] auths = auth.value().split(","); //循环遍历该方法能访问的角色是否包含该用户的角色 for (int i = 0; i < auths.length; i++) { if(auths[i].equals(role)){ return realMethod.invoke(realObject, args); } } throw new RuntimeException("你没有这个权限"); } return null; } }
客户端调用:
package cn.dhcool.proxy.auth; public class Client { public static void main(String[] args) { //创建真实对象 UserDao userDao = new UserDaoImp(); //创建用户 User user = new User("lhc","user"); ProxyClass proxyClass = new ProxyClass(userDao, user); UserDao userDaoProxy = (UserDao)proxyClass.newProxyInstance(); userDaoProxy.updataUser(); } }
发表评论
-
JDK动态代理模式
2012-12-22 21:51 862package cn.dhcool.dynamic.proxy ... -
代理proxy模式
2012-12-22 20:45 0静态代理模式: 需要有一个公共的借口,还有一个真实的实现类, ... -
工厂模式下出现的问题-null异常
2012-12-15 18:31 874遇到了一个问题: public class Dao ... -
内部类详解
2011-12-09 21:23 594从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论 ... -
动态代理实现
2011-11-22 02:03 989package com.dhcool.proxy; ... -
内省总结
2011-11-19 02:43 777package com.dhcool.introspec ... -
线程锁
2011-10-10 13:27 783sleep(), wait(),yield(),这3个方法,s ... -
类似百度谷歌分页算法实现
2011-09-08 15:58 1543<%@ page language="j ... -
充当服务端代码
2011-08-05 16:53 635import java.net.*; import java ... -
获取文件中邮件的示例
2011-08-05 12:25 707import java.util.regex.*; impo ... -
正则表达式常用字符
2011-08-05 12:22 826构造 匹配 字符 x 字符 x ... -
正则表达式
2011-08-05 12:16 778第一种:1.定义匹配规则如:String qqreg = &q ... -
InetAddress
2011-08-04 21:59 858import java.net.*; class Inet ... -
B/S socket
2011-08-04 21:08 997import java.net.*; import java ... -
TCP多线程文件上传
2011-08-04 14:51 851/* 上传图片 */ import java.io.*; ... -
网络编程基础
2011-08-04 14:25 801网络编程: 网络通讯中所需要了解的一些内容。 T ... -
一道题
2011-08-02 21:05 578/* 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 ... -
TCP
2011-08-02 20:46 715import java.net.*; import ja ... -
UDP
2011-08-02 20:35 818import java.net.*; import java ... -
mypad小程序
2011-08-02 15:48 697package menupack; import jav ...
相关推荐
通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator...
5.1.2 使用动态js代理 95 5.2 ABP展现层—本地化 97 5.2.1 程序语言 97 5.2.2 本地化源文件 98 5.2.3 获得一个本地化配置文件 100 5.2.4 总结 103 5.3 ABP展现层—Javascript函数库 103 5.3.1 AJAX 103 5.3.2 通知 ...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
通过注解实现用户身份注入 14、在线API 由于原生swagger-ui某些功能支持不够友好,故采用了国内开源的swagger-bootstrap-ui,并制作了stater,方便springboot用户使用。 15、代码生成器 基于Mybatis-plus-generator...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流。 Java绘制图片火焰效果 1个目标文件 摘要:Java源码,图形操作,火焰...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...