打印java方法参数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
打印Java方法参数
首先描述一下具体的需求就是,能不能不需要手动添加代码就能打印Java方法所有的参数,这有些时候在我们调试代码的时候有很重要的帮助。
按照这个需求,我们可以想一下我们大体需要一下什么信息,方法的名称,方法参数类型,方法参数的名字,方法参数的值。
如何实现不写代码就能够实现动态的打印这些信息呢,了解Java的这时候就都会想到动态代理。有了动态代理我们就可以不用写代码了,但是为了区分哪些方法需要打印,哪些方法不需要打印,我们这里还需要注解来辅助区分需要打印的方法。
如何获取需要打印的信息呢,这里我相信大家都会想到反射,但是反射这里有一个参数是拿不到的,哪个参数呢,方法参数的名字是拿不到的。这里我们采用的是asm的方式来获取方法参数的名字。
到这里功能已经描述清楚,需要用到的技术也描述清楚,接下来就是具体怎么实现了。
首先,我们设计了一个注解类如下:
import ng.annotation.ElementType;
import ng.annotation.Retention;
import ng.annotation.RetentionPolicy;
import ng.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public@interface MethodLog {
}
接下来就是我们设计的最后要打印的数据的一个简单的封装类,如下:
public class MethodInfo {
private int index;//参数的索引
private Object parameterType;//参数的类型
private String parameterName;//参数的名称
private Object parameterValue;//参数的值
public MethodInfo(){}
public MethodInfo(int index, Object parameterType, String parameterName, Object parameterValue) {
super();
this.index = index;
this.parameterType = parameterType;
this.parameterName = parameterName;
this.parameterValue = parameterValue;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public Object getParameterType() {
return parameterType;
}
public void setParameterType(Object parameterType) {
this.parameterType = parameterType;
}
public String getParameterName() {
return parameterName;
}
public void setParameterName(String parameterName) {
this.parameterName = parameterName;
}
public Object getParameterValue() {
return parameterValue;
}
public void setParameterValue(Object parameterValue) {
this.parameterValue = parameterValue;
}
@Override
public String toString() {
return System.getProperty("line.separator")+"index=" + index + ", parameterType=" + parameterType
+ ", parameterName="+ parameterName+ ", parameterValue=" + parameterValue;
}
}
比较简单,没什么可以描述的,接下来我们就可以写动态代理类了,这里做了一个简单的封装,如下:
import ng.reflect.InvocationHandler;
import ng.reflect.Proxy;
public class ProxyUtil{
public static
if(obj.getClass().isInterface()){
interfaces = new Class[1];
interfaces[0] = obj.getClass();
}else{
interfaces = obj.getClass().getInterfaces();
}
T ins = (T)