首先建一个接口
public interface Hello {
void say();
void say(int a,int b);
}
//继承类HelloChina
public class HelloChina implements Hello {
public void say() {
// TODO Auto-generated method stub
System.out.println("HelloChina!");
}
@Override
public void say(int a, int b) {
System.out.println("a+b="+(a+b));
}
}
//继承类HelloWord
public class HelloWord implements Hello {
public void say() {
// TODO Auto-generated method stub
System.out.println("HelloWord!");
}
@Override
public void say(int a, int b) {
System.out.println("a+b="+(a+b));
}
}
//包装类HelloWrapper
public class HelloWrapper implements Hello {
private Hello wrapper;
public HelloWrapper(Hello hello) {
// TODO Auto-generated constructor stub
this.wrapper=hello;
}
public void say() {
// TODO Auto-generated method stub
System.out.println("start to say!");
wrapper.say();
System.out.println("end to say!");
}
@Override
public void say(int a, int b) {
System.out.println("start to say!");
wrapper.say(a,b);
System.out.println("end to say!");
}
}
//动态代理类(需要继承自InvocationHandler )
public class HelloHandler implements InvocationHandler {
private Object proxyed;
public HelloHandler() {
// TODO Auto-generated constructor stub
}
public HelloHandler(Object proxyed) {
// TODO Auto-generated constructor stub
this.proxyed=proxyed;
}
@Override
public Object invoke(Object proxy1, Method method, Object[] args)
throws Throwable {
Object result;
System.out.println("start to invoke");
//调用原始对象的方法
result=method.invoke(proxyed, args);//返回调用结果
System.out.println("end to invoke");
return result;
}
}
测试类的部分代码
//代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
//代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,
//代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
//代理类可分为两种。
//l静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
//l动态代理类:在程序运行时,运用反射机制动态创建而成。
//静态代理
Hello world=new HelloWord();
Hello china=new HelloChina();
/*
HelloWrapper wa1=new HelloWrapper(world);
wa1.say();
HelloWrapper wa2=new HelloWrapper(china);
wa2.say();
wa2.say(5,5);
*/
//动态代理调用
//不分步骤
InvocationHandler in=new HelloHandler(world);
InvocationHandler h=new HelloHandler(china);
//Hello proxy1=(Hello)Proxy.newProxyInstance(world.getClass().getClassLoader(), world.getClass().getInterfaces(), in);
//proxy1.say();
//proxy1.say(4,5);
//分步骤
System.out.println("++++++++++++"+Hello.class.getClassLoader());
Class cls=Proxy.getProxyClass(world.getClass().getClassLoader(), world.getClass().getInterfaces());
Class cls1=Proxy.getProxyClass(Collection.class.getClassLoader(), new Class[]{Collection.class});
//Class cls=Proxy.getProxyClass(Hello.class.getClassLoader(), new Class[]{Hello.class});
System.out.println("++++++++++++"+cls.getName());//生成的代理类的名称$Proxy0
//System.out.println("++++++++++++"+cls.get);
Method []m=cls.getMethods();
for(int i=0;i<m.length;i++){
System.out.println("++++++++++++"+m[i].toString());
}
Constructor []co=cls.getConstructors();
for(int i=0;i<co.length;i++){
System.out.println("++++++++++++"+co[i].toString());
}
Class [] cl=cls.getInterfaces();
for(int i=0;i<cl.length;i++){
System.out.println("++++++++++++"+cl[i].toString());
}
System.out.println("++++++++++++测试二++++++++++++++++++++++++++++++");
System.out.println("++++++++++++"+cls1.getName());//生成的代理类的名称$Proxy1
Method []m1=cls1.getMethods();
for(int i=0;i<m1.length;i++){
System.out.println("++++++++++++"+m1[i].toString());
}
Constructor []co1=cls1.getConstructors();
for(int i=0;i<co1.length;i++){
System.out.println("++++++++++++"+co1[i].toString());
}
Class [] cl1=cls1.getInterfaces();
for(int i=0;i<cl1.length;i++){
System.out.println("++++++++++++"+cl1[i].toString());
}
try {
Constructor ct = cls.getConstructor(new Class[]{InvocationHandler.class});
//Constructor ct1 = cls1.getConstructor(new Class[]{InvocationHandler.class});
try {
Hello subject =(Hello) ct.newInstance(new Object[]{in});
//subject.say();
subject.say(5,10);
//subject =(Hello) ct1.newInstance(new Object[]{h});
//subject.say();
//subject.say(8,9);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
测试结果如下:
++++++++++++sun.misc.Launcher$AppClassLoader@19821f
++++++++++++$Proxy0
++++++++++++public final void $Proxy0.say()
++++++++++++public final void $Proxy0.say(int,int)
++++++++++++public final int $Proxy0.hashCode()
++++++++++++public final boolean $Proxy0.equals(java.lang.Object)
++++++++++++public final java.lang.String $Proxy0.toString()
++++++++++++public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
++++++++++++public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
++++++++++++public final void java.lang.Object.wait() throws java.lang.InterruptedException
++++++++++++public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
++++++++++++public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
++++++++++++public final native java.lang.Class java.lang.Object.getClass()
++++++++++++public final native void java.lang.Object.notify()
++++++++++++public final native void java.lang.Object.notifyAll()
++++++++++++public $Proxy0(java.lang.reflect.InvocationHandler)
++++++++++++interface proxy.Hello
++++++++++++测试二++++++++++++++++++++++++++++++
++++++++++++$Proxy1
++++++++++++public final boolean $Proxy1.add(java.lang.Object)
++++++++++++public final int $Proxy1.hashCode()
++++++++++++public final void $Proxy1.clear()
++++++++++++public final boolean $Proxy1.equals(java.lang.Object)
++++++++++++public final java.lang.String $Proxy1.toString()
++++++++++++public final boolean $Proxy1.contains(java.lang.Object)
++++++++++++public final boolean $Proxy1.isEmpty()
++++++++++++public final boolean $Proxy1.addAll(java.util.Collection)
++++++++++++public final java.util.Iterator $Proxy1.iterator()
++++++++++++public final int $Proxy1.size()
++++++++++++public final java.lang.Object[] $Proxy1.toArray(java.lang.Object[])
++++++++++++public final java.lang.Object[] $Proxy1.toArray()
++++++++++++public final boolean $Proxy1.remove(java.lang.Object)
++++++++++++public final boolean $Proxy1.containsAll(java.util.Collection)
++++++++++++public final boolean $Proxy1.removeAll(java.util.Collection)
++++++++++++public final boolean $Proxy1.retainAll(java.util.Collection)
++++++++++++public static boolean java.lang.reflect.Proxy.isProxyClass(java.lang.Class)
++++++++++++public static java.lang.Class java.lang.reflect.Proxy.getProxyClass(java.lang.ClassLoader,java.lang.Class[]) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.reflect.InvocationHandler java.lang.reflect.Proxy.getInvocationHandler(java.lang.Object) throws java.lang.IllegalArgumentException
++++++++++++public static java.lang.Object java.lang.reflect.Proxy.newProxyInstance(java.lang.ClassLoader,java.lang.Class[],java.lang.reflect.InvocationHandler) throws java.lang.IllegalArgumentException
++++++++++++public final void java.lang.Object.wait() throws java.lang.InterruptedException
++++++++++++public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
++++++++++++public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
++++++++++++public final native java.lang.Class java.lang.Object.getClass()
++++++++++++public final native void java.lang.Object.notify()
++++++++++++public final native void java.lang.Object.notifyAll()
++++++++++++public $Proxy1(java.lang.reflect.InvocationHandler)
++++++++++++interface java.util.Collection
start to invoke
a+b=15
end to invoke
分享到:
相关推荐
java 动态代理 测试类
附件为java 动态代理实例,有全码,包括测试代码。 代码少,注释全。 对理解代理非常不错。
java动态代理资源
Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...
CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和...EasyMock和jMock作为流行的Java测试库,它们提供Mock对象的方式来支持测试,都使用了CGLIB来对没有接口的类进行代理。
本工程是对静态代理,动态代理的测试,并且实现了对jdk动态代理的简单模拟!
Java写http代理服务器
使用java测试ip地址,用一个简单的方法实现ip地址的测试,调试成功,放心使用
java 代理服务源码 测试通过可以,可以自己修改成为自己的代理类。
Java socket 代理邮件发送程序,测试无问题,才敢上传!
一个简单的网络爬虫,获取代理信息以及验证代理是否可以! GetAgentTask.java main 方法测试
此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是基于 javaagent 代理实现的常见 java 定时任务测试维护工具此项目是...
资源列举了设计模式中的静态代理和动态代理的简单java实现,jdk1.8版本经过测试验证,对于想学习设计模式的童靴应该有所帮助
Java动态代理的实现 1 程序架构 创建包proxy.jdk,里面包含下面类和接口,详见批注。 类,实现了UserDao接口接口类测试类,包含main方法 类,实现了UserDao接口 接口 类 测试类,包含main方法 2 功能需求 (1) ...
用Java写的一个小工具,通过HTML解析技术,从http://www.cnproxy.com读取代理服务器列表,并采用多线程通过代理服务器连接指定网站,测试该服务器是否可用,将可以使用的代理服务器列出以供使用。这个小工具使用了...
可以了解JAVA 实现代理服务的过程,使用浏览器,进行测试。也可以自己编写客户端,服务器端代码,对代理服务进行测试,简单易懂。
该资源提供了三种代理模式的使用代码,其中包含每种模式的jar包、具体代码、Demo测试类,详细的注释帮助你来理解。
PortGroper 是一款java写的开源拒绝服务测试工具,它不是僵尸网络类的ddos,而是使用大量的代理作为bots发起DDOS。Port Groper可以与用测试防火墙,干扰web 统计脚本的跟踪,为网站增加流量..往好了用什么都能干,就是...
利用谷歌浏览器代理到本地进行测试,里面包含谷歌浏览器插件,还有详细操作步骤,欢迎使用,谢谢!有不足的地方,请留言,继续改进
java-websocket-reverse-proxy 我发现的大多数Java websocket示例都是基于或包含诸如STOMP之类的消息传递协议的。... 可以通过运行进行测试文件夹中定义的类中包含一个与该代理行为匹配的简单Java实现。