`

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 动态代理 简单实例

    运行这段代码,你会看到 "Before method call..."、"Doing something..." 和 "After method call..." 这样的输出,这就是动态代理在方法调用前后添加了额外操作的一个简单示例。 总结来说,Java动态代理是一种强大...

    java动态代理demo

    本示例将带你深入理解Java动态代理的概念,并通过一个简单易懂的demo来演示其用法。 1. **Java动态代理概念** Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写...

    java动态代理实例

    下面是一个简单的动态代理示例: ```java interface MyService { void doSomething(); } class RealService implements MyService { @Override public void doSomething() { System.out.println("Real service...

    java动态代理和cglib动态代理示例分享共5页.pdf

    以下是一个简单的Java动态代理示例: ```java public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target;...

    JDK动态代理简单示例

    现在,让我们看一个简单的JDK动态代理示例。假设我们有一个`MyService`接口和它的实现类`MyServiceImpl`: ```java public interface MyService { void doSomething(); } public class MyServiceImpl implements ...

    示例代码:java动态代理和cglib代理的简单例子

    以下是一个简单的Java动态代理和CGLIB代理的例子: ```java // 目标接口 public interface MyService { void doSomething(); } // 目标实现 public class MyServiceImpl implements MyService { @Override ...

    Java动态代理helloworld

    本篇文章将深入探讨Java动态代理的概念、原理以及如何通过一个简单的"Hello, World!"示例来理解它。 动态代理,顾名思义,是在程序运行时动态地生成代理对象。与静态代理(编译时已知)相比,动态代理更加灵活,...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    Java动态代理案例演示代码

    在提供的压缩包文件中,可能包含了一个简单的示例,展示了如何创建和使用动态代理。通过阅读和理解这个例子,你可以更深入地掌握动态代理的实现细节。如果你对某个部分有疑问,或者想要了解更多相关知识,可以参考...

    JAVA静态代理和动态代理

    以下是一个简单的静态代理模式示例: 1. 定义接口: ```java public interface Service { void doSomething(); } ``` 2. 实现目标对象: ```java public class RealService implements Service { @Override ...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    Java静态代理与动态代理demo

    以下是一个简单的静态代理实现示例: ```java // 目标接口 interface Service { void doSomething(); } // 目标实现类 class RealService implements Service { @Override public void doSomething() { System...

    java动态代理机制分析及拓展

    Java 动态代理机制是Java语言提供的一种在运行时创建代理类和代理对象的机制,主要涉及`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。动态代理通常用于实现AOP(面向切面编程)、事件...

    Java中的动态代理

    下面通过一个简单的例子来理解Java动态代理的工作原理: ```java // 定义接口 public interface HelloWorld { void sayHelloWorld(); } // 实现接口 public class HelloWorldImpl implements HelloWorld { ...

    基于Java动态代理和反射机制实现ORM

    在提供的`SimpleDAOPattern`文件中,可能包含了实现上述功能的简单示例代码,包括DAO接口、实体类、动态代理的InvocationHandler实现,以及数据库连接和SQL生成的相关类。通过阅读和理解这些代码,开发者可以更直观...

    java jdk 动态代理 演示demo

    下面是一个简单的动态代理示例: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println("Doing ...

    java动态代理详细解析

    Java动态代理是一种编程技术,主要用于在运行时创建一个新的对象,该对象可以作为现有接口的实现。动态代理的主要目的是为了在不修改原有代码的基础上,为已有的接口或类添加额外的功能,比如日志、事务管理、性能...

    java反射和动态代理实例

    以下是一个简单的动态代理示例: ```java interface MyService { void doSomething(); } class RealService implements MyService { @Override public void doSomething() { System.out.println("Real Service...

    java代码cmpp 2.0简单示例绝对可用

    在这个"java代码cmpp 2.0简单示例绝对可用"的项目中,我们可以了解到如何使用Java编程语言来实现CMPP 2.0协议的客户端。 首先,CMPP 2.0协议主要包含几个核心的消息类型,如CMPP_CONNECT、CMPP_SUBMIT、CMPP_...

    Java RMI 简单示例

    总结来说,Java RMI简单示例主要展示了以下知识点: 1. **远程接口**:定义了远程方法的签名,需要继承`Remote`接口。 2. **远程对象**:服务器端的类实现远程接口,并继承`UnicastRemoteObject`,以支持远程调用。 ...

Global site tag (gtag.js) - Google Analytics