获得方法的代码如下,字段的类似
/Project Name [online-courses]
File Name [day02genericGenericDemo5java]
Creation Date [2016-11-23]
<p>
Copyright© 2016 geyyang@hotmailcom All Rights Reserved
<p>
Work hard, play harder, think big and keep fit
/
package day02generic;
import javalangreflectMethod;
import javalangreflectParameterizedType;
import javalangreflectType;
import javautilList;
/
泛型示例-使用反射获取泛型类型<br />
@author <a href="mailto:geyyang@hotmailcom">杨舸</a>
@version 100
@since jdk 18
/
public final class GenericDemo5 {
public void testGenericReflection(List<String> list) {
}
/
测试方法<br />
@param args 命令行参数
@throws Exception 抛出的异常
/
public static void main(String[] args) throws Exception {
Method method = GenericDemo5classgetMethod("testGenericReflection", Listclass);
Type[] parameterTypes = methodgetGenericParameterTypes();
ParameterizedType parameterType = (ParameterizedType) parameterTypes[0]; // 获得第一个泛型参数, Collection类型的集合只有一个泛型参数, Map类型的集合有两个泛型参数
Systemoutprintln(parameterTypegetRawType()); // interface javautilList
Systemoutprintln(parameterTypegetTypeName()); // javautilList<javalangString>
Systemoutprintln(parameterTypegetActualTypeArguments()[0]); // class javalangString
}
}
ClassgetDeclaredMethod() 是获取这个类中所有的方法,返回的是Method[]如果有参数,第1个是方法名称,第2个是该方法的所有参数数组,这样返回的是Method这个对象Methodinvoke() 传入调用方法的类,另一个是调用这个方法所需要的参数,如果该方法没有参数,可以不填写,在JDK1,4之前,第2个参数是传入一个数组的,但是在jdk15之后,可以不传数组,多个参数用逗号隔开 不知道你听明白没
写nulld出的警告是无影响的,可以用加@SuppressWarnings屏蔽
手册上推荐写法是getMethod("show",(Class<>[]) null);强制转型
另外一个符合类型的写法是getMethod("show", new Class<>[0]);
把所有方法找出来,然后通过方法名字来推测是哪个,你既然打算反射,当然是别人通过一个字符串把要调用的方法名告诉你了,如果你连方法名都不知道,就表示你不知道要自己做什么,如果这个反射是有“人”通过界面输入来动态地执行那就表示那个“人”不知道自己要做什么?这就是另一个问题了,不是 Java 问题。
public class refP{
public static void main(String[] args)
{
Class userClass=Stringclass;//将此处换成你的class 就成了
//---- 获取所有构造方法
Constructor[] cons=userClassgetDeclaredConstructors();
Systemoutprintln("类User的构造方法包括: ");
//---- 打印出构造方法的前缀
for (int i=0;i<conslength;i++)
{
Constructor con=cons[i]; //取出第i个构造方法。
Systemoutprint(ModifiertoString(congetModifiers()));
//---- 打印该构造方法的前缀修饰符
Systemoutprint(" "+congetName()+"("); //打印该构造方法的名字
//---- 打印该构造方法的参数。
Class[] parameterTypes=congetParameterTypes(); //构造方法参数集但是 数组类型显示特殊
for(int j=0;j<parameterTypeslength;j++)
{
Systemoutprint(parameterTypes[j]getName());
}
Systemoutprintln(")");
}
}
}
/核心语句:
Class userClass=Stringclass;//找到对应的class类
Constructor[] cons=userClassgetDeclaredConstructors();//找到对应的构造器数组
Class[] parameterTypes=congetParameterTypes(); //找到每个构造器对应的参数类型数组
反射说白了就是可以获得一个类的所有信息,主要包括方法和属性两部分。
1获得方法包括获得方法的名称,方法的返回类型,方法的访问修饰符,以及通过反射执行这个方法。
2获得属性包括属性的名称,类型,访问修饰符,以及这个属性的值。
这些获得都有相应的API提供 *** 作。
举个例子:
先定义一个类,有age这个属性,以及age的get和set方法:
public class TestRflectionFather {
public int age =32;
public int getAge() {
return age;
}
public void setAge(int age) {
thisage = age;
}
}
然后 *** 作获得所有方法:
import javalangreflectMethod;
public class Testmain {
public static void main(String[] args) throws Exception {
Class clazz = ClassforName("TestRflectionFather");
Method[] methods =clazzgetDeclaredMethods();
for(Method me:methods)
{
Systemoutprintln(megetName());
}
}
}
//最后输出
getAge
setAge
在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些 *** 作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为>
以上就是关于如何获得当前类的字段,方法参数泛型的类型全部的内容,包括:如何获得当前类的字段,方法参数泛型的类型、Java反射机制获取set()方法 并且为set()方法传值、java 反射中如何获取一个参数为空的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)