`

测试java动态代理1

阅读更多
首先建一个接口

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



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics