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动态代理,本着究根问底的 ...
随机推荐
- Extjs整体加载树节点
Ext.onReady(function () { Ext.define('company', { extend: 'Ext.data.Mode ...
- jQuery scroll事件
scroll事件适用于window对象,但也可滚动iframe框架与CSS overflow属性设置为scroll的元素. $(document).ready(function () { //本人习惯 ...
- LoaderManager使用详解(二)---了解LoaderManager
了解LoaderManager 这篇文章将介绍LoaderManager类,这是该系列的第二篇文章. 一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders 四:实 ...
- CF 197 DIV2 Xenia and Bit Operations 线段树
线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...
- ANDROID STUDIO, GRADLE AND NDK INTEGRATION
Originally posted on:http://ph0b.com/android-studio-gradle-and-ndk-integration/ With the recent chan ...
- 如何计算一个字符串表示的计算式的值?——C_递归算法实现
在<C程序设计伴侣>的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe.这个程序,好 ...
- 注塑成型工艺知识大全(Injection Molding)
注塑成型,广泛用于热塑性塑料产品的制造工艺 工艺成本:模具费用(高),单件费用(低) 典型产品:汽车塑料部件,消费电子产品塑料外壳等 产量适合:只适合大批量生产 质量:极高的表面精确度,同一批次的产品 ...
- Centos环境下部署游戏服务器-iptables
简介: 图1 Centos做为服务器级操作系统,防火墙是不可缺少的.防火墙的主要功能为控制进出网络包,防火墙就如小区门卫的工作职责,检查出入小区居民的身份,如果不符合小区门卫管理条例 ...
- Qt_5_3_MSVC2012-编译QFtp-qt5编译QFtp
一.下载源码 git clone https://qt.gitorious.org/qt/qtftp.git 或者直接下载:云盘下载 二.构建 1.不对源码修改,直接构建qtftp 2.做如下修改,再 ...
- iOS 网络请求NSURLSession
iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...