`
tenderuser
  • 浏览: 61345 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

不想说了。。 代理,动态代理

    博客分类:
  • java
阅读更多
动态代理。。。使用cglib 这个jar文件。。
package test.dynasic;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class TestDynasicProxy implements MethodInterceptor {

	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		System.out.println("before method invoke  " + method.getName());
	[color=red]Object o = methodProxy.invokeSuper(proxy, args);[/color]
		System.out.println("after method invoke ");
		return o;
	}
	
	public static void main(String[]args){
		 Enhancer enhancer = new Enhancer();
		 enhancer.setSuperclass(DynasicProxy.class);
		 enhancer.setCallback(new TestDynasicProxy());
		 DynasicProxy dp = (DynasicProxy)enhancer.create();
		 dp.saySomething();
	}
	
}


class DynasicProxy{
	public void saySomething(){
		System.out.println("hello");
	}
}


java中的反射机制实现的代理,适合实现接口的类

package test;

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

public class TestProxy {
	public static void main(String[]args){
		IProxy myProxy =   (IProxy) Proxy.newProxyInstance(MyProxy.class.getClassLoader(), MyProxy.class.getInterfaces(), new MyProxyHandler<IProxy>(new MyProxy()));
		String message = myProxy.saySomething();
		System.out.println(message);
	}
}


class MyProxy implements IProxy {
	public String saySomething(){
		System.out.println("hello");
		return "ok";
	}
}

class MyProxyHandler<T> implements InvocationHandler{
	private T t;
	
	public MyProxyHandler(T t){
		this.t = t;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		Object returnMessage = null;
		try{
			System.out.println("before method invoke  "+method.getName());
		[color=red]returnMessage = method.invoke(t, args);[/color]
			System.out.println(returnMessage);
			System.out.println("after method invoke");
		} catch(Exception e){
			e.printStackTrace();
		}
		return returnMessage;
	}
	
}


接口:

package test;

interface IProxy {
	public String saySomething();
}



无语了,红色的代码让我吃尽苦头。。。 在使用代理时,不可以在代理的实现中在使用代理来调用,不然就会不断地递归调用,知道堆栈溢出,最后崩溃。。。。
分享到:
评论

相关推荐

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

    JDK 动态代理是 Java 自带的动态代理机制,它只能代理接口,而不能代理类。这是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类...

    Java代理模式Java动态代理

    - **提供间接访问:** 当客户端不能或不想直接与目标对象交互时,代理模式可以通过代理对象作为中间人来控制访问。 - **增加额外功能:** 代理模式可以在不改变原有对象的基础上为其添加新的行为或责任,如日志记录、...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    CGLIB通过动态生成子类的方式实现代理,适用于不能或不方便使用接口的情况。 #### 4. JDK Proxy与CGLIB的对比 - **JDK Proxy**: - 优点:实现简单,仅需要实现接口即可。 - 缺点:只能用于接口的代理。 - **...

    模拟JDK动态代理内部实现

    在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,这些代理对象可以在调用实际方法之前和之后执行额外的操作。这种机制主要用于实现AOP(面向切面编程)和事件监听等功能。在本文中,...

    java装饰模式及动态代理模式示例源码

    装饰模式通常用于当需要为对象添加新功能,但又不想修改原有类的结构时。在Java中,装饰模式通常通过继承实现,一个装饰类会持有原对象的引用,并在其基础上增加新的方法或增强已有方法。例如,在数据库连接池中,...

    动态代理-jdk、cglib、javassist.zip

    总结来说,JDK动态代理适合处理实现了接口的对象,CGLIB适用于没有接口或者对性能要求较高的情况,而javassist提供了更灵活的字节码操作,适用于更复杂的场景。理解并掌握这三种动态代理技术,对于提升Java编程的...

    静态代理及动态代理的劣迹摘要

    此外,如果目标接口增加新方法,代理类也需要相应地修改,这样的维护工作对于大型系统来说是个不小的负担。 而动态代理在运行时才确定代理关系,它带来了更大的灵活性和扩展性。动态代理的实现依赖于Java的反射机制...

    java-jdk动态代理的实现demo

    Java JDK 动态代理是一种强大...如果你不想上传大于100字节的文件,可以尝试寻找不受此限制的平台或调整你的文件内容以满足要求。在实际开发中,这样的限制通常是合理的,因为小文件可能不足以承载有意义的数据或代码。

    AOP的动态代理proxy

    这就是动态代理在AOP中的应用,它允许我们在不修改原始代码的情况下,向方法调用前后插入额外的行为。 总结起来,Java中的动态代理是AOP的一种实现方式,它利用`InvocationHandler`接口创建一个代理类,这个代理类...

    java dtdl 动态代理

    动态代理基于Java接口工作,因此需要定义一个或多个接口,这些接口代表了你想要代理的对象的行为。 #### c. 创建代理对象 使用`Proxy.newProxyInstance()`方法创建代理对象,传入代理接口的类加载器、接口列表和`...

    java 动态代理实现注解日志拦截

    Java动态代理是Java提供的...总结来说,Java动态代理结合注解日志拦截是一种高效且灵活的日志处理方式,它允许我们在不修改原有代码的情况下增强方法调用的前后处理,特别是对于需要统一处理的日志记录场景,非常实用。

    简谈jdk动态代理

    通过上述分析和示例,我们可以看到JDK动态代理机制的强大之处在于能够在不修改原有业务逻辑的情况下,为其添加额外的行为。这对于实现诸如事务管理、日志记录等功能非常有用。同时,JDK动态代理也为我们提供了深入...

    Java动态代理1

    假设我们有一个遗留系统,其中有一些旧接口`OldInterface`,而我们希望使用新接口`NewInterface`,但又不想修改旧系统的代码。通过动态代理,我们可以创建一个实现了`NewInterface`的代理类,让它在内部调用`...

    cglib动态代理用到的两个包

    当无法或者不想使用Java标准的JDK动态代理(只能代理接口实现类)时,CGLib可以生成目标类的子类来实现对目标对象的代理。这个过程中,CGLib的核心类`Enhancer`起到了关键作用。`Enhancer`允许开发者指定被代理的...

    java 动态代理

    然而,Java动态代理有一个限制,那就是它只能对实现了接口的类进行代理,不能对没有实现接口的类进行代理。如果你需要对类进行代理而该类没有接口,那么可能需要使用其他技术,如CGLIB。 总的来说,Java动态代理是...

    Java动态代理[动态类Proxy的使用]

    总的来说,Java动态代理为我们提供了一种灵活的编程模式,让我们可以在不修改原有代码的情况下扩展或增强已有类的行为,这对于实现AOP和工具类的构建非常有用。理解和熟练使用`java.lang.reflect.Proxy`可以帮助我们...

    IP代理搜索器-自动搜索网上的免费代理

    现在许多人常用QQ(MSN/ICQ)上网聊天,但有时候在办公室或公司内部无法使用,这时你可以通过代理来实现,有很多人上网不想留下自己的真实地址,这时你可以通IP代理来实现。虽然现在网上有很我免费的IP代理,但哪个...

    动态代理源代码 可以练习用

    - 使用`Proxy.newProxyInstance()`方法,传入类加载器(通常为接口的类加载器)、接口数组(包含所有你想代理的接口)以及你的`InvocationHandler`实例。 4. **使用示例**: - 假设我们有一个`MyService`接口和一...

Global site tag (gtag.js) - Google Analytics