文档章节

java动态代理模式示例

Jay丶
 Jay丶
发布于 2017/07/26 10:14
字数 401
阅读 2
收藏 0

代理设计模式

定义:为其他对象提供一种代理以控制对这个对象的访问。

1.定义接口

package com.tuozq.demo.proxy;
/**
 * @class Subject.java
 * @author tuozq
 * @date 2017年7月26日 上午9:34:30
 * @descriptions
 */
public interface ISubject {
	public void doSomething();

	public void working();
}

2.添加接口的实现类

package com.tuozq.demo.proxy;
/**
 * @class SubjectImpl.java
 * @author tuozq
 * @date 2017年7月26日 上午9:35:48
 * @descriptions
 */
public class SubjectImpl implements ISubject {

	@Override
	public void doSomething() {
		// TODO Auto-generated method stub
		System.out.println("SubjectImpl : doSomething……");
	}

	@Override
	public void working() {
		// TODO Auto-generated method stub
		System.out.println("SubjectImpl : working……");

	}

}

3.动态代理 实现 InvocationHandler 接口 重写 invoke方法

package com.tuozq.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import javax.naming.spi.DirStateFactory.Result;


/**
 * @class SubjectProxyHandler.java
 * @author tuozq
 * @date 2017年7月26日 上午9:36:51
 * @descriptions
 */
public class SubjectProxyHandler implements InvocationHandler {

	//被代理对象
	private Object proxyObj;

	public SubjectProxyHandler( Object proxyObj )
	{
		this.proxyObj = proxyObj;
	}


	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub

		System.out.println(method.getName() + " before……");

		Object result = method.invoke(proxyObj, args);

		System.out.println(method.getName() + " after……");

		return result;
	}

}

另一种实现方式  

package com.tuozq.demo.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @class ProxyFactory.java
 * @author tuozq
 * @date 2017年7月28日 上午9:07:31
 * @descriptions
 */
public class ProxyFactory {

	public static Object getProxyInstance(final Object target){
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args)
					throws Throwable {
				// TODO Auto-generated method stub
				System.out.println(method.getName() + " before");
				Object result = method.invoke(target, args);
				System.out.println(method.getName() + " after");
				return result;
			}

		});
	}
}

4.运行测试

package com.tuozq.demo.proxy;

import java.lang.reflect.Proxy;

import javax.security.auth.Subject;

/**
 * @class ProxyTest.java
 * @author tuozq
 * @date 2017年7月26日 上午9:40:35
 * @descriptions
 */
public class ProxyTest {

	public static void main(String[] args) {
		SubjectImpl sub = new SubjectImpl();
		ISubject Isub = (ISubject) Proxy.newProxyInstance(ISubject.class.getClassLoader(), new Class[]{ISubject.class}, new SubjectProxyHandler(sub));
		Isub.working();
	}
}

 

© 著作权归作者所有

共有 人打赏支持
Jay丶
粉丝 2
博文 61
码字总数 25284
作品 0
深圳
程序员
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
0
0
100行代码让您学会JavaScript原生的Proxy设计模式

面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了。比如我之前写过代理模式在Java中实现的两篇文章: Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理 ...

全部原谅
08/28
0
0
JAVA代理模式与动态代理模式

1、代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介...

lee123lee
2013/08/30
0
0
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

VS code编辑器安装 php7.2 NTS 版本 Xdebug

本文使用的是 phpstudy 一键安装包(windows32位) php 版本是 php7.2 NTS 1、在 phpstudy 面板中开启 phpdebug 扩展 // 其他选项菜单-> php 扩展与设置-> php 扩展 2、官方下载 Xdebug // ...

削个椰子皮_给个梨
25分钟前
1
0
Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下。如果您也碰到了同样的问题,希望本文对您有用。 问题...

程序猿DD
55分钟前
3
0
sql 命令

show variables like '%general%'; show variables like '%log_output%'; show variables like '%quer%'; show global status like '%slow%';...

JavaSon712
今天
4
0
Django修改默认数据库引擎

Django默认数据库引擎为sqlite3,除了sqlite3,还支持postgresql、mysql、oracle 配置如下:其中postgresql_psycopg2为postgresql的适配器。 'django.db.backends.postgresql' 'django.db.bac......

MichaelShu
今天
0
0
动画源码解析

目录介绍 1.Animation和Animator区别 2.Animation运行原理和源码分析 2.1 基本属性介绍 2.2 如何计算动画数据 2.3 什么是动画更新函数 2.4 动画数据如何存储 2.5 Animation的调用 3.Animator...

潇湘剑雨
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部