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. POJ 2253

    #include<iostream> #include<stdio.h> #include<math.h> #include<iomanip> #def ...

  2. Window - 浏览器对象模型

    浏览器对象模型 (BOM) 浏览器对象模型(Browser Object Model (BOM))尚无正式标准. 由于现代浏览器已经(几乎)实现了 JavaScript 交互性方面的相同方法和属性,因 ...

  3. J04-Java IO流总结四 《 FileReader和FileWriter 》

    FileReader和FileWriter的源码相对简单,下面通过分析它们的源码以更好地进行理解这两个流 1. FileReader FileReader实现了读取底层的字节数据并将其转换为字符数据的 ...

  4. Python运行MapReducer程序时所遇异常

    landen@Master:~/UntarFile/hadoop-1.0.4$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar ...

  5. vue-devtools必备工具

    1.github下载地址:https://github.com/vuejs/vue-devtools 2.下载安成之后打开cmd进入vue-devtools文件夹把依赖装好npm install 之后 ...

  6. springboot打包成jar包后找不到xml,找不到主类的解决方法

    springboot打包成jar包后找不到xml,找不到主类的解决方法 请首先保证你的项目能正常运行(即不打包的时候运行无误),我们在打包时经常遇到如下问题: springboot打包成jar包后找不 ...

  7. Tomcat性能调优-让小猫飞奔

    一.总结前一天的学习 从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   MemoryUsa ...

  8. org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security .AccessControlException: Permission denied: user=Administrator, access=WRITE, inode="hadoop": hadoop:supergroup:rwxr-xr-x

    这时windows远程调试hadoop集群出现的这里 做个记录   我用改变系统变量的方法 修正了错误 网上搜索出来大概有三种: 1.在系统的环境变量或java JVM变量里面添加HADOOP_USE ...

  9. golang基础--常量与运算符

    常量与运算符 常量的定义 常量的值在编译时已经确定 常量的定义格式与变量的基本相同 等号的右侧必须是常量或者常量表达式 规范: 常量定义时建议都使用大写,单词之间使用大写 便于包的外部调用 如果只限于 ...

  10. C# 小软件部分(一)

    自己在空闲时分整合.编写了一款小软件程序,命名为魔法兔子,希望大家可以提出意见和指导,此篇文章主要为软件的部分截图和介绍. 软件详情: 1.首先是登录,注册界面. 可以注册自己的账号,后台是腾讯云服务 ...