`

基于JDK的一个动态代理

阅读更多

注意:JDK只支持接口的动态代理,不支持类的动态代理

 

先写一个接口,以Dog为例

package com.lbx.dao;

public interface Dog {
	public void info();
	public void run();
}

 

 

Dog接口的实现

package com.lbx.dao.impl;

import com.lbx.dao.Dog;

public class DogImpl implements Dog {

	@Override
	public void info() {
		// TODO Auto-generated method stub
		System.out.println("这是一只狗");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		System.out.println("这只狗在RUN");
	}

}

 

 

目标代理对象需要在方法前后插入的方法

package com.lbx.interceptor;

public class DogInterceptor {

	public void method1(){
		System.out.println("第一个拦截方法");
	}
	
	public void method2(){
		System.out.println("第二个拦截方法");
	}
	
}

 

 

关键代码(业务处理)

package com.lbx.interceptor;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler {

	//需要被代理的目标对象
	private Object targer;
	//创建拦截器的实例
	DogInterceptor di = new DogInterceptor();
	
	//执行代理的目标方法时,此方法自动执行
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		if(method.getName().equals("info")){
			di.method1();
			result = method.invoke(targer, args);
			di.method2();
		}else {
			result = method.invoke(targer, args);
		}
		
		return result;
	}

	//用于设置传人目标对象的方法
	public void setTarger(Object o){
		this.targer = o;
	}
	
}

 

目标代理对象的工厂

package com.lbx.interceptor;

import java.lang.reflect.Proxy;

import com.lbx.dao.impl.DogImpl;

public class MyProxyFactory {

	public static Object getProxy(Object object){
		
		ProxyHandler handler = new ProxyHandler();
		handler.setTarger(object);
		
		return Proxy.newProxyInstance(DogImpl.class.getClassLoader(), 
				object.getClass().getInterfaces(), handler);
		
	} 
	
}

 

 

测试类

package com.lbx.test;

import com.lbx.dao.Dog;
import com.lbx.dao.impl.DogImpl;
import com.lbx.interceptor.MyProxyFactory;

public class Test {

	public static void main(String[] args) {
		//先要创建一个需要代理的目标对象
		Dog targerObject = new DogImpl();
		Dog dog = null;
		
		//创建代理对象
		Object proxy = MyProxyFactory.getProxy(targerObject);
		if (proxy instanceof Dog) {
			dog = (Dog)proxy;
		}
		dog.info();
		dog.run();
	}
	
}

 

 

分享到:
评论

相关推荐

    Spring框架中JDK动态代理和cglib动态代理

    这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以...

    浅谈JDK动态代理与CGLIB代理去区别

    JDK动态代理的局限性在于,它只能为实现了至少一个接口的类创建代理,因为代理对象必须继承自这些接口。这种方式适用于那些基于接口进行编程的设计,比如Spring AOP中的Advisor和Advice。 相反,CGLIB(Code ...

    java代理机制 JDK动态代理和cglib代理 详解

    JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始类相同的接口,并且在调用接口方法时,可以插入自定义的逻辑。这样,我们就可以在不...

    JDK动态代理简单示例

    此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行拦截和增强。 总之,JDK动态代理为我们提供了一种灵活的代码扩展机制,使得在不修改原有代码的情况...

    java 动态代理实例(JDK代理与CGLIB代理)

    **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以使用JDK动态代理来创建该对象的代理。以下是JDK...

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    jdk动态代理和CGlib动态代理

    如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。以下是一些关键概念: 1. **Proxy类**:这是...

    AOP之JDK动态代理和CGLib动态代理

    Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...

    JDK动态代理 spring aop 的原理

    首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了一个方法`invoke()`,该...

    spring jdk动态代理

    在Spring AOP中,当配置了基于JDK的代理时,Spring会为每个需要拦截的方法创建一个代理对象。这个代理对象实现了目标对象的所有接口,因此可以在不修改原有代码的情况下,对方法调用进行拦截。当我们通过代理调用...

    CGLIB 和 JDK生成动态代理类的区别

    JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的子类,然后通过这个子类来调用原对象的方法。因此,如果目标类没有实现任何接口,JDK动态代理就无法工作。 ...

    jdk与cglib动态代理与底层实现

    - **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    - 创建一个简单的JDK动态代理,包括自定义InvocationHandler和使用Proxy生成代理对象的代码。 - 展示Spring AOP的配置,定义切面、通知以及如何在业务代码中使用。 7. **优缺点**: - JDK动态代理简单易用,但仅...

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

    JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,我们可以创建并控制代理对象的行为。`Proxy`类提供了`...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

    输出JDK和CGLib动态代理产生的class文件.zip

    JDK动态代理基于Java的接口实现,它要求被代理的目标对象必须实现至少一个接口。Java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口是实现JDK动态代理的关键。Proxy类提供了一个静态方法`...

    jdk动态代理模式的分析与底层实现

    基于java的jdk动态代理, 比较了静态代理与动态代理的区别,以及动态代理的底层实现,反编译class文件 jdk动态代理和cglib的区别

    JDK动态代理在EJB3(包括WebService)中的应用

    动态代理在此可以用于在注入过程中添加额外的行为,例如,当注入一个EJB实例时,代理可以在注入前后执行一些操作。 2. **AOP(面向切面编程)**:动态代理常被用来实现切面,如事务管理、安全检查等。在EJB3中,...

    java动态代理(JDK和cglib).pdf

    JDK动态代理基于Java的反射API,它要求被代理的目标对象必须实现一个或多个接口。JDK动态代理的核心类是`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`。`Proxy`类用于创建动态代理实例,而`...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    CGLIB(Code Generation Library)是另一个动态代理库,它基于字节码技术,可以为任何类创建代理,而不仅仅是实现了接口的类。CGLIB使用ASM库生成代理类的字节码并加载到内存中。当原始类没有接口时,CGLIB比JDK动态...

Global site tag (gtag.js) - Google Analytics