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的更多相关文章

  1. java 动态代理 Proxy.newProxyInstance 使用心法

    使用JDk的Proxy类的静态方法newProxyInstance ,让JVM自动生成一个新的类,类中包含了inerfaces参数中的所有方法,每个方法都调用h.invoke 方法       AOP ...

  2. java动态代理--proxy&cglib

    大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...

  3. java 动态代理范例 InvocationHandler与Proxy

    java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxy ...

  4. java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

    java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...

  5. 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance

    浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...

  6. JAVA设计模式-动态代理(Proxy)示例及说明

    在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概念,下面我们就简单了解一下动态代理. 一,概念 代理设计模式的目的就是在不直接操作对象的前 ...

  7. JAVA设计模式-动态代理(Proxy)源码分析

    在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...

  8. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

  9. java动态代理——字段和方法字节码的基础结构及Proxy源码分析三

    前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

随机推荐

  1. Extjs整体加载树节点

    Ext.onReady(function () {             Ext.define('company', {                 extend: 'Ext.data.Mode ...

  2. jQuery scroll事件

    scroll事件适用于window对象,但也可滚动iframe框架与CSS overflow属性设置为scroll的元素. $(document).ready(function () { //本人习惯 ...

  3. LoaderManager使用详解(二)---了解LoaderManager

    了解LoaderManager   这篇文章将介绍LoaderManager类,这是该系列的第二篇文章. 一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders 四:实 ...

  4. CF 197 DIV2 Xenia and Bit Operations 线段树

    线段树!!1A 代码如下: #include<iostream> #include<cstdio> #define lson i<<1 #define rson i ...

  5. ANDROID STUDIO, GRADLE AND NDK INTEGRATION

    Originally posted on:http://ph0b.com/android-studio-gradle-and-ndk-integration/ With the recent chan ...

  6. 如何计算一个字符串表示的计算式的值?——C_递归算法实现

    在<C程序设计伴侣>的8.7.3 向main()函数传递数据这一小节中,我们介绍了如何通过main()函数的参数,向程序传递两个数据并计算其和值的简单加法计算器add.exe.这个程序,好 ...

  7. 注塑成型工艺知识大全(Injection Molding)

    注塑成型,广泛用于热塑性塑料产品的制造工艺 工艺成本:模具费用(高),单件费用(低) 典型产品:汽车塑料部件,消费电子产品塑料外壳等 产量适合:只适合大批量生产 质量:极高的表面精确度,同一批次的产品 ...

  8. Centos环境下部署游戏服务器-iptables

    简介:   图1        Centos做为服务器级操作系统,防火墙是不可缺少的.防火墙的主要功能为控制进出网络包,防火墙就如小区门卫的工作职责,检查出入小区居民的身份,如果不符合小区门卫管理条例 ...

  9. Qt_5_3_MSVC2012-编译QFtp-qt5编译QFtp

    一.下载源码 git clone https://qt.gitorious.org/qt/qtftp.git 或者直接下载:云盘下载 二.构建 1.不对源码修改,直接构建qtftp 2.做如下修改,再 ...

  10. iOS 网络请求NSURLSession

    iOS 7 和 Mac OS X 10.9 Mavericks 中一个显著的变化就是对 Foundation URL 加载系统的彻底重构. 现在已经有人在深入苹果的网络层基础架构的地方做研究了,所以我 ...