java 反射命令
2021/11/8 17:09:41
本文主要是介绍java 反射命令,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、关于获取Class对象的三种方式:
1、 Student student = new Student();
Class studentClass1 = student.getClass();
2、 Class studentClass2 = Student.class;
3、 Class.forName(“cn.hnist.Student”);
ps:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,无论通过哪种方式获取的Class对象都是同一个;
二、关于获取类信息的方式:
1、获取该类构造器:
(1) getDeclaredConstructors(),返回所有构造方法
(2) getConstructors(),返回所有public构造方法
(3) getConstructor(Class<?>... parameterTypes),返回指定public构造方法
例:
Constructor con0 = studentClass.getConstructor(null);
Constructor con1 = studentClass.getConstructor(boolean.class, String.class);
System.out.println(con0);
System.out.println(con1);
// 输出
//public cn.hnist.Student()
//public cn.hnist.Student(boolean, java.lang.String)
(4) getDeclaredConstructor(Class<?>... parameterTypes),返回指定构造方法
2、根据构造器创建对象:
con1.setAccessible(true);
// 假如构造器con1是private私有的,就用此方法解除私有限定
Object object = con1.newInstance(true, “张三”);
// 相当于new Student(true, “张三”);
3、获取该类成员变量:
(1) Field[] f = studentClass.getFields(),获取所有public成员变量
(2) Field[] f = studentClass.getDeclaredFields(),获取所有成员变量
(3) Field f = studentClass.getField(“name”),获取指定public成员变量
(4) Field f = studentClass.getDeclaredField(“name”),获取指定成员变量
ps:给字段设置具体的值
Class studentClass = Class.forName(“cn.hnist.Student”);
Object object = studentClass.getConstructor().newInstance();
Field field = studentClass.getField(“name”);
field.set(object, “李四”);
4、获取该类方法:
(1) Method[] methods = studentClass.getMethods(),返回所有public方法
(2) Method[] methods = studentClass.getDeclaredMethods(),返回所有方法
(3) Method method = studentClass.getMethod(“getName”, new Class[]{boolean.class, String.class}),返回指定public方法(参数:指定方法名,方法名的参数类型列表(没有参数用null表示))
(4) Method method = studentClass.getDeclaredMethod(“getName”, String.class),返回指定方法(参数:指定方法名,方法名的参数类型)
5、执行该类方法:
Object obj = studentClass.getConstructor().newInstance();
Object result= method.invoke(obj, “王五”);
// invoke参数1:要调用的对象;参数2:调用的方法要求的参数值
三、获取该方法的参数泛型和返回泛型:
//获取该类方法
Method method = Test1.class.getMethod(“test01”, Map.class, List.class);
//获取该方法的参数集合
Type[] genericParameterTypes = method.getGenericParameterTypes();
//遍历该参数集合
for (Type genericParameterType : genericParameterTypes){
System.out.println(“#”+genericParameterType);
// 判断
if (genericParameterType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
for(Type actualTypeArgument : actualTypeArguments){
System.out.println(actualTypeArgument);
}
}
}
method = Test1.class.getMethod(“test02”, null);
Type genericReturnType = method.getGenericReturnType();
if (genericReturnType instanceof ParameterizedType){
Type[] actualTypeArguments = ((ParameterizedType) genericReturnType ).getActualTypeArguments();
for(Type actualTypeArgument : actualTypeArguments){
System.out.println(actualTypeArgument);
}
}
执行结果:
这篇关于java 反射命令的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide
- 2025-01-11不得不了解的高效AI办公工具API
- 2025-01-102025 蛇年,J 人直播带货内容审核团队必备的办公软件有哪 6 款?
- 2025-01-10高效运营背后的支柱:文档管理优化指南
- 2025-01-10年末压力山大?试试优化你的文档管理
- 2025-01-10跨部门协作中的进度追踪重要性解析
- 2025-01-10总结 JavaScript 中的变体函数调用方式
- 2025-01-10HR团队如何通过数据驱动提升管理效率?6个策略
- 2025-01-10WBS实战指南:如何一步步构建高效项目管理框架?