`

java proxy

    博客分类:
  • java
 
阅读更多

1.JDK 动态代理(实现InvocationHandler),只能实现对接口的动态代理

public class JDKProxyTest {
	public static void main(String[] args) {
		TargetI ti = new Target();
		JDKProxyTarget handler = new JDKProxyTarget(ti);
		TargetI pti = (TargetI) Proxy.newProxyInstance(ti.getClass().getClassLoader(), ti.getClass().getInterfaces(), handler);
		pti.say();
	}
}

interface TargetI {
	public void say();
}

class Target implements TargetI {

	@Override
	public void say() {
		System.out.println("Target say()");
	}
}

class JDKProxyTarget implements InvocationHandler {

	private Object target;

	public JDKProxyTarget(Object target) {
		this.target = target;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("jdkproxy before");
		Object obj = method.invoke(target, args);
		System.out.println("jdkproxy after");
		return obj;
	}
	
}

 2.cglib动态代理,采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类的调用,并顺势织入横切逻辑。

public class CglibProxyTest {
	public static void main(String[] args) {
		CglibProxy cp = new CglibProxy();
		Target2 t2 = (Target2) cp.getProxy(Target2.class);
		t2.say();
	}
}

class CglibProxy implements MethodInterceptor {

	private Enhancer enhancer = new Enhancer();
	
	public Object getProxy(Class clazz) {
		enhancer.setSuperclass(clazz);
		enhancer.setCallback(this);
		return enhancer.create();
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("before");
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("after");
		return result;
	}
}

class Target2 {
	public void say() {
		System.out.println("target2 say()");
	}
}

 JDK动态代理所创建的代理对象,在JDK1.3下,性能差强人意。虽然在高版本的JDK中,动态代理对象的性能得到了很大的提高,但是有研究表明,CGLib所创建的动态代理对象的性能依旧比JDK的所创建的代理对象的性能高不少(大概10倍)。但CGLib在创建代理对象时所花费的时间却比JDK动态代理多(大概8倍),所以对于singleton的代理对象或者具有实例池的代理,因为无需频繁创建代理对象,所以比较适合用CGLib动态代理技术,反之适合JDK动态代理技术。值得一提的是,由于CGLib采用动态 创建子类的方式生成代理对象,所以不能对目标类中的final,private等方法进行代理。

分享到:
评论

相关推荐

    java proxy demo 代理类的运用demo

    在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

    Java ProxyServer是一个基于Java实现的代理服务器类,它在客户端和服务器之间起到了中继的作用,允许数据在两者间传输。代理服务器在计算机网络中的主要功能是提供代理服务,它可以隐藏客户端的真实身份,增加网络...

    java proxy

    Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理可以在运行时创建一个实现一组给定接口的新类,而无需知道实际的目标对象。代理类是在运行时动态...

    java Proxy 动态代理

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...

    深入理解Java Proxy机制.doc

    Java的Proxy机制是Java反射API的一部分,主要用于创建动态代理类和动态代理对象。它允许我们在运行时创建一个实现了特定接口的新类,这个新类的行为由我们提供的InvocationHandler对象控制。以下是对Java Proxy机制...

    深入理解JavaProxy机制.doc

    Java Proxy 机制是Java语言提供的一种动态代理功能,允许我们在运行时创建一个新的类,这个类可以实现一组指定的接口,并且在方法调用时插入自定义的行为。这主要通过`java.lang.reflect.Proxy`类和`java.lang....

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    JavaProxy Demo

    在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    Java Proxy机制详细解读

    Java Proxy机制详细解读 Java Proxy机制是Java语言中的一种设计模式,主要用于将对象的调用行为与实现解耦,提供了一个代理对象,使得外界无法直接访问目标对象,从而提高了系统的灵活性和可维护性。 Proxy机制的...

    A Java proxy for MS SQL Server Reporting Services

    NULL 博文链接:https://lgr310-163-com.iteye.com/blog/686040

    java_proxy_end

    1. **Java Proxy Class**: Java的`java.lang.reflect.Proxy`类是动态代理的基石。它允许我们在运行时创建一个新的类,这个类可以作为其他接口的实现,这样我们就可以在调用接口方法时插入自定义的行为。在这个`java_...

    proxy.rar java三种代理模式源码

    在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,`InvocationHandler`接口定义了代理对象方法调用的处理逻辑。在"DynamicProxy...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...

    Webscarab java proxy

    一个用来分析使用HTTP和HTTPS协议的应用程序框架 它的原理很简单,WebScarab记录它检测到的会话内容(请求和应答),使用者可以通过多种形式来查看记录。...也可以用它来调试程序中较难处理的 bug,也可以帮助安全...

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    JdkProxy.java

    JdkProxy.java

    Java8/java1.8的tools.jar

    4. **Java代理API**:支持Java代理(Java Proxy),使得在运行时可以动态地拦截和修改方法调用。 5. **类文件工具**:如`javap`,用于反汇编和查看Java字节码,帮助开发者理解代码执行过程。 6. **国际化工具**:...

    java动态替换代理ip

    这通常是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类提供了创建动态代理对象的方法,而InvocationHandler接口定义了调用处理程序的接口,它处理对代理对象的所有...

Global site tag (gtag.js) - Google Analytics