`

java 动态代理 简单示例

    博客分类:
  • java
 
阅读更多

动态代理示例

 

 

interface AbstractClass {
	public void show();
}

public class ClassA implements AbstractClass{

	@Override
	public void show() {
		// TODO Auto-generated method stub
		System.out.println("我是A类");
	}

}


public class ClassB implements AbstractClass{
	@Override
	public void show(){
		System.out.println("我是B类");
	}

}


public class Invoker implements InvocationHandler{
	AbstractClass ac;
	
	public Invoker(AbstractClass ac){
		this.ac = ac;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		method.invoke(ac, args);
		System.out.println("代理");
		return null;
	}
	

}


@Test
	public void test(){
		
		Invoker invoker1 = new Invoker(new ClassA());
		AbstractClass ac1 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(), new Class[]{AbstractClass.class}, invoker1);
		ac1.show();
		
		Invoker invoker2 = new Invoker(new ClassB());
		AbstractClass ac2 = (AbstractClass) Proxy.newProxyInstance(AbstractClass.class.getClassLoader(), new Class[]{AbstractClass.class}, invoker2);
		ac2.show();
	}

 

 

主要的操作都在Proxy.newProxyInstance静态方法中,

 

调用

byte[] proxyClassFile = ProxyGenerator.generateProxyClass(

   filepath, a1.getClass().getInterfaces());

会生成实现用户给出的interface和proxy的类的class,

 

调用 

proxyClass = defineClass0(loader, proxyName,

proxyClassFile, 0, proxyClassFile.length);

会将class的字节转为用户的类

 

因为都是native方法,我也就没研究这两个方法是怎么实现的了

 

 

 

可以将proxygenerator输出的字节输出看看

 

String filepath = "fileclass";
		AbstractClass a1 = new ClassA();
		byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
			    filepath, a1.getClass().getInterfaces());
		File f = new File("f:/classes/tempProxy.class");
		try {
			FileOutputStream fos = new FileOutputStream(f);
			fos.write(proxyClassFile);
			fos.flush();
			fos.close();
			System.out.println("finish");
		} catch (Exception e) {
			// TODO: handle exception
		}
 
分享到:
评论

相关推荐

    Java动态代理示例代码.rar

    使用java完成动态代理的演示代码,适合初学者理解动态代理的功能,进行参考,本代码是简单的demo代码,仅用于学习参考。

    JavaEE proxy简单代理示例

    JavaEE proxy简单代理示例

    agent:Java代理的最简单示例

    代理人Java代理的最简单示例这是Java代理实现的最简单示例。 1-Main.jar是我们的主要应用程序。 2-agent.jar包含一个在执行应用程序之前调用的代理类。

    Java简单实现动态代理模式过程解析

    主要介绍了Java动态代理模式简单案例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    spring aop简单示例.rar

    aop的原理基于java动态代理模式,本资源是spring的aop运用简单示例,用于帮助初学者理解和运用aop技术

    java-selenium-browsermobProxy:一个使用Selenium中的BrowserMob代理捕获网络呼叫的简单示例

    java-selenium-browsermobProxy 一个使用Selenium中的BrowserMob代理捕获网络呼叫的简单示例

    java-websocket-reverse-proxy:Websocket反向代理的Java实现

    java-websocket-reverse-proxy 我发现的大多数Java websocket示例都是基于或包含诸如STOMP之类的消息传递协议的。... 可以通过运行进行测试文件夹中定义的类中包含一个与该代理行为匹配的简单Java实现。

    framework-dev-learning:常见框架开发技术的demo汇总,包括java字节码编程(java agent, instrument, byte buddy), java动态代理,自定义classloader,java spi, zero copy, netty, spring aopcondition,spring boot starter, 数据库连接池等

    字节程序Java代理, 乐器, 字节好友 字节码程序java-agent-and-instrument java-agent-and-instrument-test APM ,追踪, 方法增强, 热模块替代品 完毕 空中漫步查明拉链框架开发,例如:dubbo,spring, arthas,...

    从Python程序中访问Java类的简单示例

    from jnius import autoclass ...上面的代码中,我们使用 autoclass 函数,创建了一个类型代理,对应着Java中java.util.Stack类的所有方法和字段属性。 OK,也许你想要一个Android相关的例子,看这里: from jnius imp

    java开源包4

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    simple-snmp-nms:使用Java和SNMP4J制作的SNMP NMS和代理的示例

    简单的snmp-nms 使用Java和SNMP4J制作的SNMP NMS和代理的示例 用法 指示尚未完成。

    Java范例开发大全 (源程序)

     实例216 动态的数组链表 382  实例217 你能猜出鱼是谁的宠物吗? 387  实例218 使用Collections类对List的排序操作 393  实例219 LinkedList的添加删除操作 395  实例220 运用Vector 397  实例221 改变...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包11

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包6

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包9

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    java开源包101

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包5

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics