今天这篇博客记录下费神的问题
前提引入
众所周知,在jdk1.8里,相比前边的jdk版本还是做过很多的改变,比如ArrayList的扩容改到了set里,HashMap的扩容改到了put里之类的,而这些种种都在jdk源码里明确的说明了,并且对使用者来说没什么不一样,只是对分析错误有点影响。
问题带入
接下来我要说的是,jdk对反射做的变化,以前的jdk版本不能通过反射获取类的成员函数里的参数名,而jdk8之后的版本提供了这个方法,
Parameter[] paramter = me.getParameters();
/**
* Package-private constructor for {@code Parameter}.
*
* If method parameter data is present in the classfile, then the
* JVM creates {@code Parameter} objects directly. If it is
* absent, however, then {@code Executable} uses this constructor
* to synthesize them.
*
* @param name The name of the parameter.
* @param modifiers The modifier flags for the parameter.
* @param executable The executable which defines this parameter.
* @param index The index of the parameter.
*/
源码说道:方法参数信息。也就是可以获取成员方法的参数信息,诸如参数类型,参数个数,参数名字之类。
划重点
问题就出现在这里
我通过几行剪短代码说明吧
package reflect;
public class People {
public String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People [name=" + name + "]";
}
public People(String name) {
super();
this.name = name;
}
public People() {
super();
}
}
people类里有setName 方法,我要通过反射获取到setName方法里的String name 的那么名字
反射代码如下:
package reflect_function_params;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.Arrays;
import com.sun.xml.internal.ws.wsdl.writer.document.ParamType;
import java.lang.reflect.Field;
import reflect.People;
/**
* @author chunchun
*@date 2020年9月25日
* @projectname Thread_concurrent
* 反射获取函数参数名称
*/
public class FunParams {
public static void main(String[] args) {
//通过类获取对象
Class c = People.class;
Method[] meyhods = c.getMethods();
for(Method me :meyhods) {
Parameter[] paramter = me.getParameters();
for (Parameter pa : paramter) {
System.out.println(pa.getName());
}
}
}
}
结果却是这样,一堆的不知名org0或者org1,这时候就懵逼了,说明狗屁玩意,我就想用反射获取个参数名字,你这是给我搞到JVM里去深造了不成,接下来就是看各种博客,以及打各种测试代码,直到莫一时刻,我开始怀疑是不是搞jdk这些人故意下的套,毕竟jdk目前有的问题也不好,最简单的继承机制里的重复继承,这个问题持续几十年也没人搞。终于在研究eclipse的时候发现了这个
注意看这句话
突然雨过风晴啊,原来parameter参数要手动开启啊
只要把这项勾起应用就完事了
我们要的name出来了,hhhh
说一下为什么我会研究到这里呢,其实是回过头来用servlet写demol,发现一个请求对应一个servlet实在太傻了,所以想自己搭一个小小的框架。