网站首页 > java教程 正文
一 , 什么是java反射机制?
JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
1.意义

首先,反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
再次,使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
最后,反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。
正是反射有以上的特征,所以它能动态编译和创建对象,极大的激发了编程语言的灵活性,强化了多态的特性,进一步提升了面向对象编程的抽象能力.
2.原理
反射机制(Reflection)是Java提供的一项较为高级的功能,它提供了一种动态功能,而此功能的体现在于通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。反射技术在中间件领域应用得较多。
二 .实践说明
通过反射Student类的属性和方法
Student类的代码:
package reflect;
public class Student {
//公有 的姓名
public String name="小明";
//公有 的年级
public String grade;
//受保护的 年龄
protected int age;
//私有的学分
private double credit=99.9;
//默认的课程
String course;
//无参构造方法
public Student(){
}
//有参构造方法
public Student(String name) {
this.name = name;
}
//公有的方法
public void getName(String name){
System.out.println("获取姓名:方法调用了"+name);
}
//私有方法
private void getGrade(){
System.out.println("年级方法调用了");
}
//受保护方法
protected int getCredit(int num){
System.out.println("获取学分:"+num);
return num;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", grade='" + grade + '\'' +
", age=" + age +
", credit='" + credit + '\'' +
", course='" + course + '\'' +
'}';
}
}
通过反射获取类的对象
主方法的运行
import reflect.Student;
public class Main {
public static void main(String[] args) throws ClassNotFoundException {
//1.获取Class对象
//获取类对象的第一种方式
Class stu = Class.forName("reflect.Student");
System.out.println("获取类的对象1::"+stu);
//获取类对象的第二种方式
Class stu2 = Student.class;
System.out.println("获取类的对象2::"+stu);
//获取类对象的第三种方式
Class stu3 = new Student().getClass();
System.out.println("获取类的对象3::"+stu);
System.out.println(stu==stu2);//输出true
System.out.println(stu==stu3);//输出true
}
}抛出异常:ClassNotFoundException 意思是没有找到类的异常
运行结果:
解释一下,在一个JVM中,一种类,只会有一个类对象存在。所以以上三种方式取出来的类对象,都是一样的。
通过反射获取Student属性
import reflect.Student;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1.获取Class对象
//获取类对象的第一种方式
Class stu = Class.forName("reflect.Student");
System.out.println("获取类的对象1::"+stu);
//2.获取字段
System.out.println("************获取所有公有的字段********************");
Field[] fieldArray = stu.getFields();
//遍历属性
for(Field f : fieldArray){
System.out.println("获取所有公有的字段"+f);
}
System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
fieldArray = stu.getDeclaredFields();
for(Field f : fieldArray){
System.out.println("获取所有的字段(包括私有、受保护、默认的):"+f);
}
System.out.println("*************获取公有字段**并调用***********************************");
Field field = stu.getField("name");
System.out.println("调用姓名"+field);
//获取一个对象
Object obj = stu.getConstructor().newInstance();
System.out.println("设置属性之前:" + field.getName() + "===" + field.get(obj));
//为字段设置值
field.set(obj, "小明");
//验证
Student stuObj = (Student)obj;
System.out.println("设置属性之后:" + field.getName() + "===" + field.get(obj));
System.out.println("**************获取私有字段****并调用********************************");
Field credit = stu.getDeclaredField("credit");
System.out.println("获取私有字段****并调用"+credit);
credit.setAccessible(true);//暴力反射,解除私有限定
System.out.println("设置属性之前:" + credit.getName()+"===" + credit.get(obj));
credit.set(obj, 999);
System.out.println("设置属性之后:" + credit.getName() + "===" + credit.get(obj));
}
}运行结果
通过反射获取类的方法
import reflect.Student;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//1.获取Class对象
//获取类对象的第一种方式
Class stu = Class.forName("reflect.Student");
System.out.println("获取类的对象1::"+stu);
//2.获取所有公有方法
//获取一个对象
Object obj = stu.getConstructor().newInstance();
System.out.println("***************获取所有的”公有“方法*******************");
Method[] methodArray = stu.getMethods();
for(Method m : methodArray){
System.out.println("获取所有公有方法"+m);
}
System.out.println("***************获取所有的方法,包括私有的*******************");
methodArray = stu.getDeclaredMethods();
for(Method m : methodArray){
System.out.println("获取所有的方法,包括私有的"+m);
}
System.out.println("***************获取公有的getName()方法*******************");
Method m = stu.getMethod("getName",String.class);
System.out.println("获取公有的getName"+m);
//设计值
m.invoke(obj, "小");
System.out.println("***************获取私有的getCredit()方法******************");
m = stu.getDeclaredMethod("getCredit",int.class);
System.out.println("获取私有的getCredit()方法:"+m);
m.setAccessible(true);//解除私有限定
Object result = m.invoke(obj, 20);//需要两个参数,一个是要调用的对象(获取有反射),一个是实参
System.out.println("返回值学分:" + result);
}
}
反射方法运行结果:
使用到的异常:
ClassNotFoundException? :?没有找到类的异常 NoSuchMethodException: 没有找到方法的异常 IllegalAccessException : 没有访问权限的异常 InvocationTargetException :包装由调用方法或构造方法所抛出异常的受查异常 InstantiationException: 指不能实例化某个对象
与Java反射相关的类如下:
- Class类 代表类的实体,在运行的Java应用程序中表示类和接口
- Field类 代表类的成员变量(成员变量也称为类的属性)
- Method类 代表类的方法
- Constructor类 代表类的构造方法
动态代理的时候也可以用到反射等。比如aop。
猜你喜欢
- 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的反射机制,你要是再看不懂,神仙都没救了
欢迎 你 发表评论:
- 12-03电脑怎么选(电脑怎么选定文字)
- 12-03vivo应用商店官方app下载(vivo应用商店下载安装官方正版)
- 12-03usb无线网卡驱动下载win7(usb无线网卡驱动安装包)
- 12-03怎样设置无线路由器桥接功能
- 12-03免费硬盘数据恢复工具有哪些
- 12-03桌面显卡性能天梯图快科技(桌面显卡天梯图 快科技)
- 12-03tplink路由器怎么连接(tplink路由器怎么连接联通光猫)
- 12-03bt磁力蜘蛛引擎(磁力 蜘蛛 搜索)
- 最近发表
- 标签列表
-
- 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)

本文暂时没有评论,来添加一个吧(●'◡'●)