测试java动态代理
来源:互联网 发布:压缩软件for mac 编辑:程序博客网 时间:2024/06/05 11:44
首先建一个接口
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
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
0 0
- 测试java动态代理
- Java 代理,动态代理
- JAVA的Proxy动态代理在自动化测试中的应用
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- sublime Text的使用
- 第八周 项目5 计数的模式匹配
- 第九周项目2-对称矩阵压缩存储的实现与应用
- 查看chrome浏览器的DNS
- 第九周项目2—— 对称矩阵压缩存储的实现与应用(2)
- 测试java动态代理
- 编程的检测和一维数组
- 第九周 项目3 建立稀疏矩阵表示的三元组算法库
- 使用国内docker 镜像仓库
- 【第九周 项目2-对称矩阵压缩存储的实现与应用(1)】
- BufferedReader获取json的时候有中文乱码解决
- Android加载超长图(微博长图)
- 《您的设计模式》(CBF4LIFE)之“模板方法模式”【整理】
- Android gdb调试方法