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. js04

    接着看一些js的基础,这里主要说一下js的对象. 1.对象:    js中的所有事物都可以看作是对象:字符串.数值.数组.函数...    内建对象:String    Date    Array   ...

  2. How React Works (一)首次渲染

    How React Works (一)首次渲染 一.前言 本文将会通过一个简单的例子,结合React源码(v 16.4.2)来说明 React 是如何工作的,并且帮助读者理解 ReactElement ...

  3. Flume搭建及学习(基础篇)

    转载请注明原文出处:http://www.cnblogs.com/lighten/p/6830439.html 1.简介 该文主要是翻译官方的相关文档,源地址点击这里.介绍一下Flume的一些基本知识 ...

  4. 【Java并发编程】:Runnable和Thread实现多线程的区别

    Java中实现多线程有两种方法:继承Thread类.实现Runnable接口,在程序开发中只要是多线程,肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下 ...

  5. python基础笔记之面向对象

    # class Foo:# name="kevin"## def __init__(self,puppy):# self.tomato= 'red'# self.dog = pup ...

  6. kibana-1-安装

    由于es5.2版本对head的插件支持不如2.4 安装挺麻烦, 于是选用kibana 关于5.2安装head插件可见这个博客 http://www.cnblogs.com/xing901022/p/6 ...

  7. WPF的ControlTemplate和DataTemplate简介

    首先理清几个概念,Template.ControlTemplate.ContentTemplate.DataTemplate.ContentControl 这几个东西名字都差不多,意思感觉也接近,初次 ...

  8. urlrewriteFilter condition----reference

    src:http://tuckey.org/urlrewrite/manual/2.6/ <condition> element An element that lets you choo ...

  9. RabbitMQ上手记录–part 3-发送消息

    接上一part<<RabbitMQ上手记录–part 2 - 安装RabbitMQ>>,这里我们来看看如何通过代码实现对RabbitMQ的调用. RabbitMQ通常是安装在服 ...

  10. JDK动态代理[3]----WeakCache缓存的实现机制

    上一篇我们分析了Proxy类的内部是怎样产生代理类的,我们看到了Proxy内部用到了缓存机制,如果根据提供的类加载器和接口数组能在缓存中找到代理类就直接返回该代理类,否则会调用ProxyClassFa ...