1.1. 查看动态代理类的各种信息
通过反射机制可以获取Proxy创建的动态代理类的各种信息,包括实现的接口,构造函数,方法等。查看到这些信息后,可以更好的理解为什么动态代理这么使用。
/** * @Title: ProxyTest.java * @Package com.test.javatechnology.proxy * @Description: * @author http://www.cnblogs.com/coe2coe/ * @date 2017年3月26日 下午5:36:28 * @version V1.0 */ package com.test.javatechnology.proxy; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.lang.reflect.Proxy; /** * @ClassName: ProxyTest * @Description: * @author http://www.cnblogs.com/coe2coe/ * @date 2017年3月26日 下午5:36:28 * */ public class ProxyTest3 { //接口 static interface Example{ int work(int a, int b); } //实际对象的类 static class SomeExample implements Example{ @Override public int work(int a, int b) { System.out.println("SomeExample.work() called."); return a+b; } } //用于代理类创建代理对象实例的Handler。 public static void main(String[] args) { try { //实际对象。 final SomeExample realObject = new SomeExample(); //使用newProxyInstance()方法创建代理类的对象实例 Example example = (Example)Proxy.newProxyInstance( SomeExample.class.getClassLoader(),//类加载器。 SomeExample.class.getInterfaces(), //实现的接口。 new InvocationHandler(){//Handler //在调用代理对象实例的方法时会执行此函数。 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("invoke before:" + method.getName() ); //转发到实际对象。 Object result = method.invoke(realObject, args); System.out.println("invoke after:" + method.getName() ); return result; } } ); //获取代理类的Class信息。 Class clazz = example.getClass(); //获取代理类实现的接口。 System.out.println("interfaces:"); for(Class i: clazz.getInterfaces()){ System.out.println(i.getTypeName()); } //获取代理类的构造函数 System.out.println("constructos:"); for(Constructor c: clazz.getConstructors()){ System.out.print(c.getName() + "(" ); boolean first=true; for(Parameter p: c.getParameters()){ if(!first){ System.out.print(" , "); } else{ first=false; } System.out.print(p.getType().getTypeName() + " " + p.getName()); } System.out.println(")"); } //获取代理类的方法。 System.out.println("methods:"); for(Method m: clazz.getMethods()){ System.out.print(m.getName() + "(" ); boolean first=true; for(Parameter p: m.getParameters()){ if(!first){ System.out.print(" , "); } else{ first=false; } System.out.print(p.getType().getTypeName() + " " + p.getName()); } System.out.println(")"); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } } }
运行结果:
interfaces:
com.test.javatechnology.proxy.ProxyTest3$Example
constructos:
com.test.javatechnology.proxy.$Proxy0(java.lang.reflect.InvocationHandler arg0)
methods:
equals(java.lang.Object arg0)
toString()
hashCode()
work(int arg0 , int arg1)
isProxyClass(java.lang.Class arg0)
newProxyInstance(java.lang.ClassLoader arg0 , java.lang.Class[] arg1 , java.lang.reflect.InvocationHandler arg2)
getInvocationHandler(java.lang.Object arg0)
getProxyClass(java.lang.ClassLoader arg0 , java.lang.Class[] arg1)
wait()
wait(long arg0 , int arg1)
wait(long arg0)
getClass()
notify()
notifyAll()
时间: 2024-12-27 20:32:27