文档章节

Java代理

素人派
 素人派
发布于 2015/07/22 07:56
字数 398
阅读 31
收藏 0
  • 介绍
Java中的代理在某些场合下显得非常有用,可以让Java不再被束缚到一个class类文件中,比如:一个Java进程想调用另一个Java进程中的类(class)貌似是不可能的事情。是Java的代理让这变成了可能,究其原理其实也很简单——一个Java类的最本质就是一个字节码文件,只要是能在本地的JVM中制造出一个相同的字节码文件不就可以调用了吗? 代理和反射是息息相关的,所以有关代理最重要的一个类就是java.lang.reflect.Proxy。 java.lang.reflect.InvocationHandler Proxy.newProxyInstance(classLoader, interfacesList, proxyHandler)这个方法会返回生成的代理对象。 classLoader是定义了Proxy类的类加载器 interfacesList是代理类需要实现的接口列表,也就是被代理对象实现的接口 proxyHandler是接口InvocationHandler的实现类的实例对象
  • 示例
[codesyntax lang="java" lines="normal"]
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author suren
 * @date 2015-3-31
 *
 *       http://surenpi.com
 */
public class Test
{
	public static void main(String[] args)
	{
		HelloBoy helloBoy = new HelloBoy(); //这个可以想象成Spring在实例化bean的过程
		ProxyHelloBoy proxyHelloBoy = new ProxyHelloBoy(helloBoy);

		//下面的这个过程可以想象成Spring在做依赖注入的过程
		Hello hello = (Hello) Proxy.newProxyInstance(helloBoy.getClass().getClassLoader(),
				helloBoy.getClass().getInterfaces(), proxyHelloBoy);

		hello.say();
	}
}

interface Hello
{
	void say();
}

class HelloBoy implements Hello
{
	public void say()
	{
		System.out.println("boy say hello to you.");
	}
}

class ProxyHelloBoy implements InvocationHandler
{
	private Object target;

	public ProxyHelloBoy(Object target)
	{
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable
	{
		System.out.println("prepare to visit http://surenpi.com");
		Object result =method.invoke(target, args);
		System.out.println("done visit http://surenpi.com");

		return result;
	}

}
[/codesyntax]
  • 参考
http://xiaoniudu2008.iteye.com/blog/236050 http://blog.csdn.net/rokii/article/details/4046098

本文转载自:http://surenpi.com/2015/03/31/java%e4%bb%a3%e7%90%86/

共有 人打赏支持
下一篇: omxplayer
素人派
粉丝 25
博文 1907
码字总数 10223
作品 6
东城
程序员
私信 提问
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank
2018/06/21
0
0
解决Fiddler不能监听Java HttpURLConnection请求的方法

在默认情况下,Fiddler不能监听Java HttpURLConnection请求。究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是在应用程序和操作系统网络通信层之...

小克898
2013/05/18
0
0
关于jdk1.6的instrumentation代理使用问题

Java SE 6 的新特性:虚拟机启动后的动态 instrument 在 Java SE 5 当中,开发者只能在 premain 当中施展想象力,所作的 Instrumentation 也仅限与 main 函数执行前,这样的方式存在一定的局...

关键词
2014/03/12
202
0
Spring AOP切点表达式详解

简介 面向对象编程,也称为OOP(即Object Oriented Programming)最大的优点在于能够将业务模块进行封装,从而达到功能复用的目的。通过面向对象编程,不同的模板可以相互组装,从而实现更为...

张旭峰
2018/06/05
0
2
JMX学习以及在log4j中的应用

前言 JMX即Java Managemen Extensions,是一个为应用程序植入管理功能的框架。一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。 常常在编程的过程中...

buglife
2015/01/06
0
15

没有更多内容

加载失败,请刷新页面

加载更多

分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
9分钟前
0
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
31分钟前
0
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
39分钟前
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
40分钟前
2
0
Mybatis的结果集处理

此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。 Mybatis会将结果集按照映射配置文件中定义的映射规...

算法之名
53分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部