如题,目前本人只知道利用Exception对象可以获取当前运行的方法名和类名等信息。
现在还希望能够获得参数的信息,主要是参数的类型列表。
最终的目的是能够得到Method对象,请各位大牛不吝赐教!

解决方案 »

  1.   

    参考:org.apache.commons.logging.Log;
         org.apache.commons.logging.LogFactory;以上这两个类:实现如下:  
    public static final Log LOG = LogFactory.getLog(你想要加载的类.class);
    调用info方法:
     LOG.info("打印信息");
      

  2.   

    方法的参数列表一般通过动态代理获得。如果类有接口的话可以直接使用 JDK 中的动态代理(java.lang.reflect.InvocationHandler),如果没有接口的话 JDK 的动态代理就用不了了,可以使用 Cglib 的动态代理功能。
      

  3.   

    回hpjianhua:请问具体如何通过log.info方法获得当前运行方法的参数类型列表呢?回火龙果:我就是要在一个普通java类(无任何继承和接口实现)的方法运行时获得当前这个方法的参数类型列表,请问有Cglib实现此功能的例子吗?最好有代码。感谢两位!
      

  4.   

    代码很简单:测试类:
    public class Test {    public static void main(String[] args) {
            Student stu = Student.newProxyInstance();
            stu.doWork("Xiao Zhang", 22);
        }
    }测试代理类的原始类:
    public class Student {    public Student() {
        }    public static Student newProxyInstance() {
            return ProxyFactory.newInstance(Student.class);
        }    public void doWork(String name, int age) {
            System.out.println("name: " + name + ", age: " + age);
        }
    }代理对象工厂:
    import java.lang.reflect.Method;import net.sf.cglib.proxy.Callback;
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;public class ProxyFactory {    private ProxyFactory() {
        }    private final static Callback DEFAULT_CALLBACK = new DefaultCallback();    public static <T> T newInstance(Class<T> clazz) {
            return newInstance(clazz, DEFAULT_CALLBACK);
        }    @SuppressWarnings("unchecked")
        public static <T> T newInstance(Class<T> clazz, Callback callback) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(clazz);
            enhancer.setCallback(callback);
            return (T)enhancer.create();
        }    private static class DefaultCallback implements MethodInterceptor {        @Override
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy proxy) throws Throwable {            // 输出一些方法的调用信息
                System.out.println("---------------");
                System.out.println("Method: " + method.toGenericString());
                for(int i = 0; i < args.length; i++) {
                    System.out.println("args[" + i + "] = " + args[i]);
                }
                System.out.println("---------------");            // 调用方法
                return proxy.invokeSuper(obj, args);
            }
        }
    }
      

  5.   

    Cglib 在 Spring 的依赖包中有,也可以到 http://cglib.sourceforge.net/ 去下载,Cglib 官网上还有例子。
      

  6.   

    使用时需要注意:若使用 enhancer.create(); 创建代理对象的话,需要原始类中必须有个非 private 空参数的构造方法。若是有参数的构造方法时,需要使用另外一个 create 方法来创建。