打印java方法参数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 T getProxy(T obj,InvocationHandler h){ Class[] interfaces = null;

if(obj.getClass().isInterface()){

interfaces = new Class[1];

interfaces[0] = obj.getClass();

}else{

interfaces = obj.getClass().getInterfaces();

}

T ins = (T)

相关文档
最新文档