1.什么事反射机制动态代理

在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接。

2.演示

学生管理类StudentManager.Class有三个方法,功能是新增一个学生数据addStudent(),删除一个学生数据deleteStudent(),

获取当前时间getPersenterTime(),我通过动态代理实现,在addStudent()和deleteStudent()方法中我们在方法体的开头动态代理执行打开数据库的操作,在方法体的结尾我们动态代理关闭数据库连接的操作。

为这三个方法定义接口规范 StudentService

public interface StudentService {
public void addStudent(String username);
public void deleteStudent(String username);
public String getPersentTime();
}

StudentManager.Class如下

public class StudentManager implements StudentService {
/**
* 新增学生数据
*
* @param username
*/
public void addStudent(String username) {
System.out.println("在数据库中插入一条学生纪律");
} /**
* 删除学生数据
*
* @param username
*/
public void deleteStudent(String username) {
System.out.println("在数据库中删除一条学生纪律");
} /**
* 返回服务器当前时间
*
* @return
*/
public String getPersentTime() {
return "2018-07-30 3:30";
}
}

添加方法拦截器StudentListener

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class StudentListener implements InvocationHandler {
//代表需要代理的方法名
private String methodsName = "addStudent,deleteStudent"; public StudentListener(StudentManager manager) {
this.manager = manager;
} private StudentManager manager; @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (methodsName.contains(method.getName())) {
//需要动态代理
System.out.println("打开数据库链接");
method.invoke(manager, args);
System.out.println("关闭数据库链接");
} else if (method.getName().equals("getPersentTime")) {
//不需要动态代理,直接反射执行方法
return method.invoke(manager, null);
}
return null;
}
}

Proxy.newProxyInstance() 实现调用,也可以封装一下返回接口代理类方便调用。

import java.lang.reflect.Proxy;

public class Main {
public static void main(String[] args) {
StudentManager studentManager = new StudentManager();
Class clazz = studentManager.getClass();
StudentListener listener = new StudentListener(studentManager); StudentService serviceProxy = (StudentService) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), listener);
serviceProxy.addStudent("张三");
System.out.println("------------------------");
serviceProxy.deleteStudent("李四");
System.out.println("------------------------");
System.out.println("时间:" + serviceProxy.getPersentTime());
}
}

输出结果如下:

Java反射机制动态代理的更多相关文章

  1. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  2. Java反射和动态代理

    Java反射 反射机制 RTTI 编译器在编译时打开和检查*.class文件 反射机制 运行时打开和检查*.class文件 Java反射常见的方法 java反射的应用 setAccessible(bo ...

  3. java反射实现动态代理

    参考:http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html http://my.oschina.net/lyp3314/b ...

  4. Java反射与动态代理

    Java反射机制可以动态地获取类的结构,动态地调用对象的方法,是java语言一个动态化的机制.java动态代理可以在不改变被调用对象源码的前提下,在被调用方法前后增加自己的操作,极大地降低了模块之间的 ...

  5. Java 反射之动态代理

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt205 利用Java反射机制你可以在运行期动态的创建接口的实现.java.la ...

  6. java反射与动态代理的理解

    一.什么是反射机制? 反射的官方定义是这样的:在运行状态中,对于任意的一个类,都能够知道这个类的所有属性和方法,对任意一个对象都能够通过反射机制调用一个类的任意方法,这种动态获取类信息及动态调用类对象 ...

  7. java反射和动态代理实现与原理详细分析

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  8. 基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解

    1.前言 项目中都会使用常量类文件, 这些值如果需要变动需要重新提交代码,或者基于@Value注解实现动态刷新, 如果常量太多也是很麻烦; 那么 能不能有更加简便的实现方式呢? 本文讲述的方式是, 一 ...

  9. 【Java】代理模式、反射机制-动态代理

    关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html 这里通过参考博客中的例子整理个人理解. 代理模式: 访问某个类的方法 ...

随机推荐

  1. python代码的那些设计

    一.Django的ORM 1.类QuerySet (django) :QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作.只要你查询的时候才真正的操作数据库. 2. ...

  2. Numpy 数组的切片操作

    实例+解释如下(表格):关键是要明白python中数组的下标体系.一套从左往右,一套从右往左. 1 import numpy as np 2 import sys 3 4 def main(): 5 ...

  3. GDAL VS2010 win7(64位)安装、使用说明(图文解析)

    一.电脑配置及安装版本 Win 7(64位机) Visual Studio 2010 GDAL 1.9.2(我也尝试了最新版GDAL1.11.0,应该同样可以用的,只是在重新配置时又选用了老一点的版本 ...

  4. sublime text ubuntu

    { "color_scheme": "Packages/User/SublimeLinter/Dawn (SL).tmTheme", "font_fa ...

  5. [笔记] Python字符串

    1.字符串是以单引号'或双引号"括起来的任意文本 比如'Mifen',"Amd794",'-956-$*'等等.注意:不能单双引号组合,涉及字符串中存在单双引号出现,应用 ...

  6. C语言理论知识

    C语言-----理论部分   一:软件开发概述1.程序语言的发展:机器语言-->汇编语言-->高级语言.2.软件开发的基本步骤与方法:分析问题,建立数学模型-->确定数据结构和算法- ...

  7. 在Eclipse中,用XFire发布web服务

    配置及相关说明见http://www.cnblogs.com/xshy3412/archive/2007/09/29/910848.html 仅确定发布xfire需要的最基本的jar activati ...

  8. Ionic3 UI组件之 PhotoViewer

    PhotoViewer是常用的Cordova Plugin之一,用来显示图片. 组件特性: 根据Url显示图片 支持手势,可放大缩小 带分享按钮,可分享图片 带关闭按钮 加载错误时自动关闭组件 支持B ...

  9. Spring学习之路

    (一)搭建Spring.NET环境常见的DLL 1.spring.core --整个框架的基础,实现了依赖注入的功能 2.Spring.AOP--提供面向方面编程(aop)的支持 3.Spring.D ...

  10. Hibernate下的增删改查

    概述: 关系--对象映射的中间件,属于开源ORM框架,是我们业务逻辑层中的调用数据库的中间件 演变: jdbc---hibernater---mybatis hibernate和mybatis区别? ...