Java代理的小例子

利用代理可以在运行时创建一个实现了一组给定接口的新类。

需要一个调用处理器(invocation handler),调用处理器需实现InvocationHandler接口。无论何时调用代理对象的方法,调用处理器的invoke方法都会被调用,并向其传递Method对象和原始的调用参数。

创建代理对象,需要使用Proxy类的newProxyInstance方法。此方法有三个参数:

1、一个类加载器(class loader),null代表默认

2、接口数组

3、一个调用处理器

使用代理的作用:

1、路由对远程服务器的方法调用

2、在程序运行期间,将用户接口事件与动作关联起来(spring AOP就是)

3、为调试,跟踪方法调用

下面的例子就是跟踪方法调用。以二分查找法为例,注:Integer实现comparable接口,代理类覆盖toString方法:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Date;
import java.util.Random;

import javax.swing.JOptionPane;
import javax.swing.Timer;

public class TextMain {
public static void main(String args[]) {
    Object[] elements=new Object[1000];
    for(int i=0;i<elements.length;i++){
        Integer value=i+1;
        InvocationHandler handler=new TraceHandler(value);
        Object proxy=Proxy.newProxyInstance(null, new Class[]{Comparable.class}, handler);
        elements[i]=proxy;

    }
    Integer key=new Random().nextInt(elements.length)+1;
    int result=Arrays.binarySearch(elements, key);
    if(result>=0)System.out.println(elements[result]);
}

}
class TraceHandler implements InvocationHandler{

    private Object target;
    public TraceHandler(Object t){
        target=t;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        // TODO Auto-generated method stub
        System.out.print(target);
        System.out.print("."+method.getName()+"(");
        if(args!=null){
            for(int i=0;i<args.length;i++){
                System.out.print(args[i]);
                if(i<args.length-1)
                    System.out.print(",");
            }

        }
        System.out.println(")");

        return method.invoke(target, args);

    }

}

运行结果:

500.compareTo(269)
250.compareTo(269)
375.compareTo(269)
312.compareTo(269)
281.compareTo(269)
265.compareTo(269)
273.compareTo(269)
269.compareTo(269)
269.toString()
269

  InvocationHandler 中的invoke方法,定义了代理对象调用方法时希望执行的动作(跟踪,记录日志)

  Proxy中newProxyInstance构造一个实现指定接口的代理类的实例,所有方法都将调用给定处理器对象的invoke方法。

  所有代理类都扩展于proxy类,Proxy只有一个实例域——调用处理器InvocationHandler

时间: 2024-10-10 23:14:24

Java代理的小例子的相关文章

java即时通信小例子

学习java一段时间了,今天写来一个即时通信的小例子练手在其过程中也学到了一些知识拿出来和大家分享,请路过的各位大神多多赐教... 好了下面讲一下基本的思路: 首先,编写服务器端的程序,简单点说吧就是在服务上开启一个线程循环等待客户端的连接,为每一个连接到服务器的Socket 创建一个实例存放在集合中,然后使用InputSteam读取从客户端发过来的数据然后转发给除自己之外的所有的客户端 然后是客户端,首先开启一个线程连接都服务器端,循环监听服务器发送回来的数据 这里要说一下为了明确是谁发出的消

Java处理文件小例子--获取全国所有城市的坐标

需求:前端展示数据,全国城市的坐标 这个是 echarts 的 制作地图JSON 工具, 但是没有全国的,只有各个省 前端需要的数据:    所以现在 下载所有的省数据: 然后是Java处理. 这是这里重点, 在开发中, 很多繁琐的事 ,我们都可以用程序来控制: package cn.ycmedia.common.utils; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; i

Java代理的小知识

这篇博客主要是看了一位大牛的博客所写的,该大牛写的是数据库连接池的实现,看了他的代码,顿时觉得很牛牛.所以在这里我也记录下我自己的demo,虽然不提倡重复造轮子,但是很多时候我们在重复造轮子的过程中才会有技术的提高,所以在这里我就重复造下轮子吧 这篇博客主要写的是关于Java动态代理的一个demo 情景如下: 在LOL游戏中,有个现象是代练的问题,实际游戏账号者会请代练,而这个代练在这里就是代理,帮实际游戏账号者进行帮打晋级赛的活动 UML图我就不画了,目前对这方面的知识还没去学,打算过段时间再

java中tcp小例子

服务端: ServerSocket service = new ServerSocket(7777); Socket socket = service.accept(); InputStream input = socket.getInputStream(); OutputStream out = socket.getOutputStream(); BufferedInputStream bufinput = new BufferedInputStream(input); BufferedOut

Java加密程序小例子

1:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的. 加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换. package cn.zzsxt.lianxi;import java.util.Scanner;public class Practice { public static void main(String[] args) { System.out.println("请输入一个四位数字:"); Sca

java操作xml的一个小例子

最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要定义好bean的层次结构就可以了,第三方包会自动生成和解析xml. 但是今天发现,这个包有两个问题: 一个是比较复杂(我是菜鸟,求别喷,我真的觉得他挺复杂的..).比如说你要想处理既有属性又有值的xml就比较麻烦.(@XStreamConverter注解这种方法报这个错:com.thoughtwor

java连接mysql的一个小例子

想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一个小例子数据库如下如 代码 package query; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; impor

Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See

JAVA数据库应用的一个小例子

自己随便写的,以炉石为背景,写一个参考用的小例子,先上SQL表: if OBJECT_ID('card_pool') is not null drop table card_pool; create table card_pool( card_id int identity(1,1) not null, card_name varchar(32), card_occupation varchar(32), --卡牌职业:中立.德鲁伊.猎人.法师.圣骑士.牧师.潜伏者.萨满祭司.术士.战士 car