`
TrueBrian
  • 浏览: 8980 次
社区版块
存档分类
最新评论

JDK动态代理小例子

 
阅读更多

代理的最大作用,就是在已知源代码的情况下,在不改变原来代码的条件下,增加自己的逻辑。

比如说控制权限,增加日志等。此例就以增加日志来说明动态代码的基本用法。

JDK的动态代码必须要基于接口,所以被代理的对象必须要实现某一个或多个接口。

1.接口

有一个动物接口,有两个方法吃和睡。很简单吧

interface Animal {
	void eat();
	void sleep();
}

2.真实的类。即后面的被代理对象。

cat类,实现了animal接口

class Cat implements Animal {


	@Override
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("cat eating...");
	}

	@Override
	public void sleep() {
		// TODO Auto-generated method stub
		System.out.println("cat sleeping...");
	}
}


现在有一个需求,系统要求在每一个方法执行和结束时都加上日志,简单点就是加上下面两句话:

  System.out.println(new Date() + " xxx 方法开始执行!");
  xxx方法执行中。。
  System.out.println(new Date() + "xxx 方法结束!");

最简单的就是在每个方法中前后都加上这样一段代码,但是方法很多时显然是不现实的。或者是当你手里头没有方法的源代码时,也无法实现。

这是就用得上动态代理了。


3.处理方法,我们的处理逻辑

</pre><p></p><p></p><pre name="code" class="java">import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;

class LogMethodHander implements InvocationHandler {

        //即将被代理的对象
       private Object target;

	public LogMethodHander(Object target) {
		super();
		this.target = target;
	}
//创建代理对象的函数,即用此函数产生代理target的对象
	public Object newProxy(Object obj) {
		return Proxy.newProxyInstance(getClass().getClassLoader(), getClass()
				.getInterfaces(), this);
	}

//在这里加上我们自己的逻辑
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		// TODO Auto-generated method stub
		System.out.println(new Date() + " : " + method.getName() + " 方法开始执行!");
		//真实方法执行
                method.invoke(targer, args);
		System.out.println(new Date() + " : " + method.getName() + " 方法结束!");
		return null;
	}

}

4.测试方法

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

public class DynamicProxyTest {

	public static void main(String[] args) {
		//真实类
		Animal cat = new Cat();
               //处理函数,创建代理所用
		LogMethodHander handler = new LogMethodHander(cat);
               //代理类,其中用上面的处理函数做了一个参数
		Object proxy = Proxy.newProxyInstance(cat.getClass().getClassLoader(),
				cat.getClass().getInterfaces(), handler);
		
		if(proxy instanceof Animal){
			Animal animalProxy = (Animal) proxy;
			animalProxy.eat();
			animalProxy.sleep();
		}
	}
}

5.运行结果:

LOG: Sun Aug 03 21:14:38 CST 2014 : eat 方法开始执行!
cat eating...
LOG: Sun Aug 03 21:14:38 CST 2014 : eat 方法结束!
LOG: Sun Aug 03 21:14:38 CST 2014 : sleep 方法开始执行!
cat sleeping...
LOG: Sun Aug 03 21:14:38 CST 2014 : sleep 方法结束!




分享到:
评论

相关推荐

    JDK动态代理简单示例

    JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...

    JDK动态代理和CGLIB代理

    JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...

    spring jdk动态代理

    下面是一个简单的例子,展示如何创建一个JDK动态代理: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System....

    jdk动态代理 + 拦截器实现小例

    在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    JDK内置动态代理例子

    这个“JDK内置动态代理例子”旨在演示如何利用Java的反射API和`java.lang.reflect.Proxy`类来实现类似拦截器的功能。下面我们将深入探讨相关知识点。 首先,动态代理的核心在于`java.lang.reflect.Proxy`类。这个类...

    jdk和cglib动态代理的例子{jar包+源码}

    jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压

    JDK动态代理proxy

    JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...

    java jdk 动态代理演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象能够拦截方法调用并在调用前后执行自定义的行为。在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect....

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...

    JDK的动态代理总结

    通过这个例子,我们可以看到,JDK动态代理是如何方便地在不修改原有代码的情况下,为方法调用添加额外行为的。虽然这里只介绍了基本的用法,但实际应用中,JDK动态代理可以实现更复杂的逻辑,是Java开发中的一个重要...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理类,这些代理类可以扩展或修饰已存在的接口实现。动态代理在很多场景下非常有用,比如日志记录、性能监控、事务管理等,这些功能可以在不修改原始...

    spring-demo16-JDK动态代理.zip

    这个例子可以帮助开发者理解如何在实际应用中利用JDK动态代理来实现功能扩展,以及如何在Spring框架中无缝集成这一特性。通过实践这个示例,开发者可以更好地掌握面向切面编程的精髓,提升代码的可维护性和灵活性。

    java动态代理例子

    这里我们将深入探讨两个主要的Java动态代理实现:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于Java接口实现,适用于目标对象实现了至少一个接口的情况。它通过`java.lang.reflect.Proxy`类和`...

    spring动态代理类的示范小版本,很简单的例子

    这个"spring动态代理类的示范小版本,很简单的例子"应该是提供了一个简单易懂的示例,帮助我们理解Spring动态代理的工作原理。 在Spring中,动态代理主要有两种实现方式:JDK动态代理和CGLIB代理。它们都是为了实现...

    jdk动态代理使用[文].pdf

    在Java编程中,JDK动态代理是一种强大的工具,它允许我们在运行时创建代理类来拦截对目标对象的调用,从而实现额外的功能,比如日志记录、性能监控、事务管理等,而无需修改原始代码。这里我们将深入探讨JDK动态代理...

    JDK和CGlib分别实现的动态代理源代码

    两者在性能上,CGlib通常比JDK代理稍快,但创建代理的过程相对复杂。选择哪种代理方式取决于具体的需求和项目情况。了解并掌握这两种动态代理技术,能够使你在处理AOP(面向切面编程)等高级编程需求时游刃有余。

    JDK动态代理的代码组织与AOP

    在Java开发中,JDK动态代理是一个非常重要的概念,它允许我们在运行时创建对现有接口的代理实现。这种技术在很多场景下都有应用,比如面向切面编程(AOP)和框架设计。本文将深入探讨JDK动态代理的代码组织方式以及...

    动态代理(AOP)简单例子

    在这个"动态代理(AOP)简单例子"中,可能会展示如何使用JDK或CGLIB创建代理对象,以及如何使用匿名类实现InvocationHandler接口。同时,通过对比直接调用和动态调用,可以更直观地理解动态代理带来的优势。这个例子...

    动态代理例子

    在Java中,动态代理基于JDK的java.lang.reflect包中的两个关键类:Proxy和InvocationHandler。Proxy类用于创建一个实现了特定接口的代理对象,而InvocationHandler接口定义了一个方法,这个方法会在代理对象调用目标...

Global site tag (gtag.js) - Google Analytics