请问如何获取当前运行方法的参数类型列表? 如题,目前本人只知道利用Exception对象可以获取当前运行的方法名和类名等信息。现在还希望能够获得参数的信息,主要是参数的类型列表。最终的目的是能够得到Method对象,请各位大牛不吝赐教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考:org.apache.commons.logging.Log; org.apache.commons.logging.LogFactory;以上这两个类:实现如下: public static final Log LOG = LogFactory.getLog(你想要加载的类.class);调用info方法: LOG.info("打印信息"); 方法的参数列表一般通过动态代理获得。如果类有接口的话可以直接使用 JDK 中的动态代理(java.lang.reflect.InvocationHandler),如果没有接口的话 JDK 的动态代理就用不了了,可以使用 Cglib 的动态代理功能。 回hpjianhua:请问具体如何通过log.info方法获得当前运行方法的参数类型列表呢?回火龙果:我就是要在一个普通java类(无任何继承和接口实现)的方法运行时获得当前这个方法的参数类型列表,请问有Cglib实现此功能的例子吗?最好有代码。感谢两位! 代码很简单:测试类: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); } }} Cglib 在 Spring 的依赖包中有,也可以到 http://cglib.sourceforge.net/ 去下载,Cglib 官网上还有例子。 使用时需要注意:若使用 enhancer.create(); 创建代理对象的话,需要原始类中必须有个非 private 空参数的构造方法。若是有参数的构造方法时,需要使用另外一个 create 方法来创建。 windows linux 之间传递文件参数 java swing单击按钮隐藏显示JtextField的问题? 一道线程的面试题,高手帮下忙谢谢 java股票信息系统请教一个小问题2 请问如何遍历一个目录下的所有文件? sql连接问题!!!在线等! URLEncodedUtils.parse()处理中文有错误? 200分提问一个很难问题~ HelloWorld问题? 关于RMI的一个问题 看看谁能帮我搞定这个困扰了我一个晚上的鼠标事件问题 正则表达式如何匹配字符串<br>
org.apache.commons.logging.LogFactory;以上这两个类:实现如下:
public static final Log LOG = LogFactory.getLog(你想要加载的类.class);
调用info方法:
LOG.info("打印信息");
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);
}
}
}