测试java动态代理

首先建一个接口 

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值