首页 > 代码库 > Java重要技术(27)动态代理之查看代理对象的类型信息

Java重要技术(27)动态代理之查看代理对象的类型信息

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()

 

Java重要技术(27)动态代理之查看代理对象的类型信息