java 代理实现方式

简介:


先讲一下概念,代理,什么是代理?

举个例子吧。很多人喜欢在淘宝或者天猫上淘一些生活用品或者衣服,这个购买过程就产生了本文的重点,代理。你知道你购买的商家叫什么名,但是不知道他后面的厂家是谁?这件衣服是哪个厂家卖给了你,你完全不知道,其实这个过程就是代理,厂家委托商家卖衣服给你,商家就是代理类,代理卖这个厂家这个品牌的衣服,厂家就是委托类,委托商家埋衣服。什么北京区代理,黑龙江总代理,都是这个方式的。


代理分为动态,和静态。先说说静态代理,

//代理接口类

public interface SpiderOrder {


//订单1

public void crawlingSpider1();

//订单2

public void crawlingSpider();

}

//委托类

public class SpiderOrderImpl implements SpiderOrder{


@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

System.out.println("订单1-----");

}


@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

System.out.println("订单2-----");

}


}

//静态代理类

public class SpiderOrderProxy implements SpiderOrder{


private SpiderOrderImpl spiderOrderImpl;

public SpiderOrderProxy(SpiderOrderImpl spiderOrderImpl) {

super();

this.spiderOrderImpl = spiderOrderImpl;

}


@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider1();

System.out.println("具体的执行");

}


@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider();

System.out.println("具体的执行");

}


}

说明:你看这个静态代理有啥缺点吗? 代理接口新增一个方法,实现类要全都实现,静态代理类也要全部都实现这个新增方法。你这接口方法少还行,项目大了,经常会变动的。还有就是这个你知道哪个类是代理类,可以直接去用,事先是知道的。如果不知道呢具体的代理类,如何呢?接下来讲解动态代理类。


动态代理,利用了很多反射的技术知识,开始


//中介类

public class WorkInvocationHandler implements InvocationHandler{


private Object object;//代理类持有一个委托类对象

public WorkInvocationHandler(Object object) {

super();

this.object = object;

}


@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println(" 方法调用之前 ");

method.invoke(object, args);

System.out.println(" 方法调用之后 ");

return null; 

}

}


中介类必须实现InvoCationhandler类,来处理。当我们调用代理的具体的方法的时候,会统一的到中介类的invoke方法上,这样我们可以在invoke方法上做具体的逻辑,根据不同的情况做不同的处理,参数Method是方法,proxy是具体的代理类。这个中介类的输出是在这个代理类具体实现方法前,和方法后做具体的处理。


public class InvokeClient {


public static void main(String[] args) {

SpiderOrder spidOrder = new SpiderOrderImpl();

InvocationHandler invocation = new WorkInvocationHandler(spidOrder);

SpiderOrder proxySipderOrder = (SpiderOrder) Proxy.newProxyInstance(invocation.getClass().getClassLoader(), spidOrder.getClass().getInterfaces(), invocation);

System.out.println("输出这个反射出来的proxySipderOrder" + proxySipderOrder.getClass().getName());

//这实际上回调用到

proxySipderOrder.crawlingSpider();

proxySipderOrder.crawlingSpider1();

}

}

会发现,中介类与代理类也构成了一个静态代理关系,这个关系中,中介类是委托类,代理类是代理类。这样做的好处就是将代理类与被代理对象分离开来,这样我们可以在代理类与被代理类随意组合。也就是说动态代理是由两组静态代理构成的,这也基本是原理了。自己品味一下这个JDK动态代理。

spring AOP是基本原理是动态代理,分为jdk的动态代理,和CGLIB代理组成。




本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/1914306


相关文章
|
缓存 运维 负载均衡
java面试题之个人对正向代理和反向代理的理解
java面试题之个人对正向代理和反向代理的理解
1243 3
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
283 2
|
11月前
|
Java
JAVA 静态代理 & 动态代理
【11月更文挑战第14天】静态代理是一种简单的代理模式实现,其中代理类和被代理类的关系在编译时已确定。代理类实现与被代理类相同的接口,并持有被代理类的实例,通过调用其方法实现功能增强。优点包括代码结构清晰,易于理解和实现;缺点是对于多个被代理类,需为每个类编写相应的代理类,导致代码量大增,维护成本高。动态代理则在运行时动态生成代理类,更加灵活,减少了代码冗余,但可能引入性能损耗和兼容性问题。
117 0
|
缓存 负载均衡 安全
|
12月前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获
|
设计模式 Java
Java进阶之代理
Java进阶之代理
68 3
|
设计模式 Java
Java进阶之代理
【7月更文挑战第16天】Java动态代理通过`java.lang.reflect.Proxy`和`InvocationHandler`实现,无需编译期定义代理类。与静态代理相比,它更灵活,代码更简洁,适用于方法数量变化或未知接口代理。
74 2
|
数据采集 Java 数据安全/隐私保护
使用Java进行网络采集:代理IP与参数传递详解
Java参数传递是按值传递,包括对象引用的值。当传递对象时,方法内部修改对象内容会影响原始对象,但不能改变原始引用。示例展示了如何在爬虫代理中使用此机制,通过`ProxySettings`类传递代理信息,方法内可访问但不能更改原始对象。理解这一机制对编写高效无错的Java代码至关重要。
121 0
使用Java进行网络采集:代理IP与参数传递详解
|
Java 数据库 Spring
Java编程问题之在测试中使用CGLIB创建代理类如何解决
Java编程问题之在测试中使用CGLIB创建代理类如何解决
169 0