Dog类
public interface Dog
{
public void info();
public void run();
}
实现Dog类
public class DogImpl implements Dog
{
public void info()
{
System.out.println("我是一匹狼");
}
public void run()
{
System.out.println("我奔跑迅速");
}
}
拦截Dog实例的拦截器的拦截器类。
public class DogIntercepter
{
public void method1()
{
System.out.println("=====模拟通用方法一=====");
}
public void method2()
{
System.out.println("=====模拟通用方法二=====");
}
}
下面是JDK反射体系里的一个接口,它可以动态调用目标对象的方法。该类实现了java.lang.reflect.InvocationHandler接口。
public class ProxyHandler implements InvocationHandler
{
private Object target;
DogIntercepter di = new DogIntercepter();
public Object invoke(Object proxy, Method method, Object[] args)throws Exception
{
Object result = null;
if (method.getName().equals("info"))
{
di.method1();
result = method.invoke(target, args);
System.out.println("methodname=="+method.getName());
System.out.println("target==="+target);
System.out.println("proxy==="+proxy);
di.method2();
}
else
{
result = method.invoke(target, args);
}
System.out.println("result="+result);
return result;
}
public void setTarget(Object o)
{
this.target = o;
}
}
系统还需要提供一个代理工厂,它的主要作用就是根据目标对象生成一个代理对象。
public class MyProxyFactory
{
public static Object getProxy(Object object)
{
//Dog控制类 代理的操作类
ProxyHandler handler = new ProxyHandler();
//把该dog实例托付给代理操作
handler.setTarget(object);
//第一个参数是用来创建 动态代理 的ClassLoader对象,只要该对象能访问Dog接口即可。
//也就只要DogImpl与Dog在同一
System.out.println("111---"+object.getClass());
System.out.println("222---"+object.getClass().getInterfaces()[0]);
return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);
}
}
Proxy.newProxyInstance方法根据接口数组动态创建代理实例,接口数组通过object.getClass().getInterfaces()方法获得,该类实现传入参数里接口数组的全部接口,因此Dynamic Proxy要求被代理的必须是接口的实现类,否则无法为其构造相应的动态实例。
下面是主程序:
public class TestDog
{
public static void main(String[] args)
{
Dog targetObject = new DogImpl();
Dog dog = null;
Object proxy = MyProxyFactory.getProxy(targetObject);
System.out.println("proxy="+proxy.getClass().getName());
if (proxy instanceof Dog)
{
dog = (Dog)proxy;
System.out.println(dog.getClass());
}
dog.info();//dog是代理类,当它调用方法时,会自动调用InvocationHandler子类的invoke方法
dog.run();
}
}
分享到:
相关推荐
在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...
Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...
此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行拦截和增强。 总之,JDK动态代理为我们提供了一种灵活的代码扩展机制,使得在不修改原有代码的情况...
总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...
- **JDK动态代理**:适用于目标类已经实现接口的情况,使用简单,但只能针对接口进行代理。 - **CGLIB代理**:更适合未实现接口的类,更灵活,但生成代理类的速度较慢,因为涉及到字节码的生成。 总结: Java代理...
Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面...这种基于JDK动态代理实现的Struts拦截器,是Java Web开发中一种强大的设计模式。
NULL 博文链接:https://xxjkcyt.iteye.com/blog/1413467
- **JDK代理**适用于目标类实现有接口的情况,更符合面向接口的设计原则,且无需引入额外的库。 - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成...
- **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...
下面是一个简单的JDK动态代理示例,我们创建一个计算服务接口`Calculator`,然后使用动态代理来实现该接口,并在代理对象中添加日志功能。 ```java // 目标接口 interface Calculator { int add(int a, int b); } ...
创建一个简单的JDK动态代理拦截器: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println(...
动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...
JDK代理基于接口,适用于简单场景;CGLIB通过字节码技术,适用于更复杂的需求。开发者可以根据项目需求选择合适的方法。对于学习和理解这两种动态代理机制,可以参考提供的博客链接,以及深入研究源码,这将有助于...
在Java开发中,JDK的动态代理是一种非常重要的技术,它允许我们在运行时创建具有特定接口的代理类实例,从而实现代理对象对目标对象的方法调用进行拦截和增强。这篇博客将对JDK的动态代理进行深入的总结,探讨其原理...
下面将详细介绍这两个关键组件以及如何创建和使用动态代理。 首先,`java.lang.reflect.Proxy`是用于生成动态代理类的类。它提供了一个静态方法`newProxyInstance()`,这个方法接收三个参数:一个类加载器、一个...
在压缩包中的“jdk动态代理”文件夹中,可能包含了演示如何创建和使用动态代理的Java源代码。通过分析这些代码,你可以更深入地理解动态代理的工作原理和实际应用。同时,配合博主的文章学习,可以更好地掌握动态...
在Java开发中,JDK动态代理是一个非常重要的技术特性,它允许我们在运行时创建一个类的代理对象,这个代理对象可以拦截对原对象的方法调用,并在调用前后执行额外的操作。这种技术常用于实现AOP(面向切面编程)或者...
在Java编程中,JDK动态代理是一种强大的工具,它允许我们在运行时创建代理类来拦截对目标对象的调用,从而实现额外的功能,比如日志记录、性能监控、事务管理等,而无需修改原始代码。这里我们将深入探讨JDK动态代理...
JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...
* 动态代理(JDK代理、接口代理、拦截器模式) * 动态代理中的静态方法:java.lang.reflect.Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler(监听处理器)) * * 代码示例:《帮爸爸...