java动态代理Proxy
package com.gz_06; public interface StudentDao {
public void login();
public void regist();
}
package com.gz_06; public class StudentDaoImpl implements StudentDao{ @Override
public void login() {
System.out.println("登陆");
} @Override
public void regist() {
System.out.println("注册");
} }
package com.gz_06; public class StudentDaoImpl2 implements StudentDao{ @Override
public void login() {
System.out.println("权限验证");
System.out.println("登陆");
System.out.println("动态代理");
} @Override
public void regist() {
System.out.println("权限验证");
System.out.println("注册");
System.out.println("动态代理");
} }
package com.gz_06; public interface UserDao {
public void add();
public void delete();
public void change();
public void find();
}
package com.gz_06; public class UserDaoImpl implements UserDao{ @Override
public void add() {
System.out.println("增加操作");
} @Override
public void delete() {
System.out.println("删除操作");
} @Override
public void change() {
System.out.println("修改操作");
} @Override
public void find() {
System.out.println("查询操作");
} }
package com.gz_06; public class UserDaoImpl2 implements UserDao{ @Override
public void add() {
System.out.println("权限校验");
System.out.println("增加操作");
System.out.println("日志记录");
} @Override
public void delete() {
System.out.println("权限校验");
System.out.println("删除操作");
System.out.println("日志记录");
} @Override
public void change() {
System.out.println("权限校验");
System.out.println("修改操作");
System.out.println("日志记录");
} @Override
public void find() {
System.out.println("权限校验");
System.out.println("查询操作");
System.out.println("日志记录");
} }
package com.gz_06; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class Test {
public static void main(String[] args) {
UserDao ud=new UserDaoImpl();
ud.add();
ud.delete();
ud.change();
ud.find();
System.out.println("----------");
//但是在实际开发中,一般在进行操作的时候都需要进行权限验证,操作后需要进行日志记录,怎么办呢?
//因为是一部分人需要权限校验,和日志记录,所以第一种方式是重写一个实现类
UserDao ud2=new UserDaoImpl2();
ud2.add();
ud2.delete();
ud2.change();
ud2.find();
System.out.println("--------");
//其他的类也需要权限校验,又这样做?
StudentDao stu=new StudentDaoImpl();
stu.login();
stu.regist();
System.out.println("-----");
StudentDao stu2=new StudentDaoImpl2();
stu2.login();
stu2.regist();
System.out.println("------");
//这样做太恶心了,所以我们要学会偷懒,就需要使用动态代理
/* static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。
InvocationHandler 是代理实例的调用处理程序 实现的接口。
Object invoke(Object proxy, Method method, Object[] args) 在代理实例上处理方法调用并返回结果。
*/
InvocationHandler handler=new MyInvocationHandler(ud);
UserDao proxy=(UserDao) Proxy.newProxyInstance(ud.getClass().getClassLoader(), ud.getClass().getInterfaces(), handler);
proxy.add();
proxy.delete();
proxy.change();
proxy.find(); System.out.println("------");
InvocationHandler handler2=new MyInvocationHandler(stu);
StudentDao proxy2= (StudentDao) Proxy.newProxyInstance(stu.getClass().getClassLoader(), stu.getClass().getInterfaces(), handler2);
proxy2.login();
proxy2.regist(); }
} package com.gz_06; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler {
private Object target;//目标代理对象
public MyInvocationHandler(Object target){
this.target=target;
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("权限校验");
Object result=method.invoke(target, args);
System.out.println("日志记录");
return result;
} }
java动态代理Proxy的更多相关文章
- java 动态代理 Proxy.newProxyInstance 使用心法
使用JDk的Proxy类的静态方法newProxyInstance ,让JVM自动生成一个新的类,类中包含了inerfaces参数中的所有方法,每个方法都调用h.invoke 方法 AOP ...
- java动态代理--proxy&cglib
大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...
- java 动态代理范例 InvocationHandler与Proxy
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxy ...
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- JAVA设计模式-动态代理(Proxy)示例及说明
在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概念,下面我们就简单了解一下动态代理. 一,概念 代理设计模式的目的就是在不直接操作对象的前 ...
- JAVA设计模式-动态代理(Proxy)源码分析
在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...
- java动态代理基本原理及proxy源码分析一
本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...
- java动态代理——字段和方法字节码的基础结构及Proxy源码分析三
前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
随机推荐
- HDU 1465 不容易系列之一(错排,递归)
简而言之,就是把n个信封全部装错的可能数.(中问题,具体看题目) //当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示, //那么M(n-1)就表示n-1个编号元素放在 ...
- GCD常用方法
1.延迟操作 2.一次性代码 3.队列组 /** * 延迟执行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC ...
- MYSQL - ORDER BY & LIMIT
http://stackoverflow.com/questions/4708708/mysql-order-by-limit
- java系统属性
java系统属性 1. java.runtime.name:java的运行环境名称. 2. sun.boot.library.path:jdk\jre中的bin的路径 3. java.vm.versi ...
- ExtJs之单选及多选框
坚持 <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-eq ...
- Spring MVC 教程,快速入门,深入分析(转)
原文地址:http://elf8848.iteye.com/blog/875830/
- 唉,还是Windows好
作为一个计算机专业的,常常抱怨Windows慢.一个系统用一段时间慢下来就重装,但是次次重装很麻烦,每次重装之后还得装软件. 另外,Windows比Linux占资源,所以前段时间就想以Linux为主要 ...
- Textures
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer=NULL; //顶点缓存 LPDIRECT3DTEXTURE9 g_Texture=NULL;//纹理对象 bool In ...
- lintcode: 生成括号
生成括号 给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果. 样例 给定 n = 3, 可生成的组合如下: "((()))", "(()())&q ...
- iOS开发--UITableView
-.建立 UITableView DataTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)]; [Data ...