网站首页 > java教程 正文
如下文章字数大约1100字以及若干代码块,阅读时间需要20分钟左右。
相关技术内容会持续更新,大家可随时交流,欢迎关注本头条号。
Java反射机制是Java语言中一种很重要的机制,而且在很多框架中都有用到这种机制。在我们的程序结构中能动态获取类的信息以及动态调用对象的方法的功能来自于Java的反射机制(Reflection)。
在JDK中,提供了以下类来实现Java反射机制,这些类都位于java.lang.reflect包下:
Class类:代表一个类(注意:Class类位于java.lang包下);
Field类:代表类的成员变量;
Method类:代表类的方法;
Constructor类:代表类的构造方法;
Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
通过API提供的这些类里的方法,我们可以动态获取想要的类的内部信息。
另外一点重要的是:
Class类中存在以下几个重要的方法:
1.getName()
一个Class对象描述了一个特定类的特定属性,而这个方法就是返回String形式的该类的简要描述。由于历史原因,对数组的Class对象
调用该方法会产生奇怪的结果。
2.newInstance()
该方法可以根据某个Class对象产生其对应类的实例。需要强调的是,它调用的是此类的默认构造方法。例如:
MyObject x = new MyObject();
MyObject y = x.getClass().newInstance();
3.getClassLoader()
返回该Class对象对应的类的类加载器。
4.getComponentType()
该方法针对数组对象的Class对象,可以得到该数组的组成元素所对应对象的Class对象。例如:
int[] ints = new int[]{1,2,3};
Class class1 = ints.getClass();
Class class2 = class1.getComponentType();
而这里得到的class2对象所对应的就应该是int这个基本类型的Class对象。
5.getSuperClass()
返回某子类所对应的直接父类所对应的Class对象。
6.isArray()
判定此Class对象所对应的是否是一个数组对象。
知道了基本概念后,具体的代码内容:
假设测试类为 TestReflect,对应的路径为 singTest.invoke.TestReflect。
【1】通过一个对象获得完整的包名和类名
TestReflect testReflect = new TestReflect();
System.out.println("===="+ testReflect.getClass().getName());
System.out.println("===="+ testReflect.getClass().getName());
输出内容分别为:
singTest.invoke.TestReflect
class singTest.invoke.TestReflect
【2】 实例化Class类对象
Class<?> class1 = null;
Class<?> class2 = null;
Class<?> class3 = null;
class1 = Class.forName("singTest.invoke.TestReflect");
class2 = new TestReflect().getClass();
class3 = TestReflect.class;
System.out.println("===类名称 1===" + class1);
System.out.println("===类名称 2===" + class2);
System.out.println("===类名称 3===" + class3);
上述三种都是实例化对应的类,输出结果均为:class singTest.invoke.TestReflect。
【3】获取某个类的全部属性
Class<?> clazz = Class.forName("singTest.invoke.TestReflect");
//取得本类中全部属性
//TestReflect 类中属性就是 serialVersionUID 与 test1
Field[] field = clazz.getDeclaredFields();
for(int i=0;i<field.length;i++){
//权限修饰符
int mo = field[i].getModifiers();
System.out.println("==mo=="+mo);
String priv = Modifier.toString(mo);
System.out.println("==priv=="+priv);
//属性类型
Class<?> type = field[i].getType();
System.out.println(priv + " " + type.getName() + " " + field[i].getName() + ";");
}
会输出对应类下所有变量属性,具体可自己操作实验。
【4】通过反射机制调用某个类的方法
Class<?> clazz = Class.forName("singTest.invoke.TestReflect");
//调用 TestReflect 类中的 reflect1 方法
Method method = clazz.getMethod("reflect1");
//调用reflect1 方法
method.invoke(clazz.newInstance());
//输出:Java 反射机制 - 调用某个类的方法1
//调用reflect2方法
method = clazz.getMethod("reflect2",int.class,String.class);
method.invoke(clazz.newInstance(),20,"Tom");
//输出:Java 反射机制-调用某个类的方法2
以上为根据反射机制写的一些简单例子。最近工作较忙,总结有限。如果想继续深入,可以自己继续研究或者私信我。
后面看时间有可能发布一个关于反射相关的工具类。
下篇预告:讲解一下Linux中不同主机间的免密登录方法。
已上内容,纯属一家之言,因本人能力一般,见识有限,如有问题,请不吝指正,感谢。
相关技术内容会持续更新,大家可随时交流,欢迎关注本头条号。
猜你喜欢
- 2024-09-12 学习java应该如何理解反射?(怎么理解java反射)
- 2024-09-12 Java反射详解(java反射总结)
- 2024-09-12 读懂框架设计的灵魂—Java 反射机制
- 2024-09-12 Java的反射机制(java的反射机制是什么)
- 2024-09-12 java反射机制Java反射机制是什么?原理详解
- 2024-09-12 聊一聊Java当中的反射机制(java的反射机制是什么)
- 2024-09-12 Java反射机制的理解(java反射机制的理解和认识)
- 2024-09-12 聊一聊Java的反射机制?(java的反射机制是什么)
- 2024-09-12 Java学习之二——JAVA反射机制(java 反射机制原理)
- 2024-09-12 实操讲解Java的反射机制,你要是再看不懂,神仙都没救了
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)