网站首页 > java教程 正文
想起来之前之前面试过的一个程序员,我问了这样的一个问题,“你了解什么是反射机制吗?”
他说:“反射?不就是Class.forname()吗,知道。”然后就没有然后了……
所以今天就简单地来聊聊Java当中的反射机制到底是怎么回事。
什么是反射机制?
Java反射技术应用广泛,它能配置:类的全限定名、方法、完成对象的初始化,甚至是反射某些方法。
反射机制可以理解成一种动态创建对象的过程,和new一样,都能够用来创建对象。只不过反射机制除了能创建对象以外,还能够了解对象当中的内部结构,包括属性、方法、构造方法等。
为什么要要反射?
使用反射的目的是增加程序的灵活性,使程序在必要的时候使用非new的方式来创建对象。目前在框架中使用反射机制是用得最彻底的,例如Spring框架、Mybatis框架等等。
反射到底怎么用?
1、无参构造函数反射对象
当类中的构造函数没有参数时,具体代码如下:
package com.fs.test;
public class Student {
public Student() {} //无参构造函数
public void sayHello() {
System.out.println("hello");
}
}
package com.fs.test;
public class MyMain {
public static void main(String[] args)throws Exception{
//获取Student字节码文件
Class clazz = Class.forName("com.fs.test.Student");
//生成Student对象
Student stu = (Student)clazz.newInstance();
stu.sayHello();//调用方法
}
}
输出结果为:hello
2、有参数的构造函数反射对象
当类中构造函数带有参数时,具体代码如下:
package com.fs.test;
public class Student {
String name;
public Student(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("hello"+name);
}
}
package com.fs.test;
import java.lang.reflect.Constructor;
public class MyMain {
public static void main(String[] args)throws Exception{
//获取Student字节码文件
Class clazz = Class.forName("com.fs.test.Student");
//获取构造函数对象,并指明构造函数中参数的数据类型
Constructor constructor = clazz.getConstructor(String.class);
//生成Student对象,并指定构造函数的实际参数
Student stu = (Student)constructor.newInstance("小明");
//调用方法
stu.sayHello();
}
}
输出结果为:hello小明
3、私有的构造函数反射对象
如果类中的构造函数由private修饰,以上方法就不能用了,要先将其设置成可访问性的再进行反射。(这里就能看出来反射其实是有一定安全隐患的,它可以无视private),具体代码如下:
package com.fs.test;
public class Student {
private Student() {}
public void sayHello() {
System.out.println("hello");
}
}
package com.fs.test;
import java.lang.reflect.Constructor;
public class MyMain {
public static void main(String[] args)throws Exception{
//获取Student字节码文件
Class clazz = Class.forName("com.fs.test.Student");
//获取构造函数
Constructor constructor = clazz.getDeclaredConstructor();
//设置该构造函数对象为可读
constructor.setAccessible(true);
//生成对象
Student stu = (Student)constructor.newInstance();
//调用方法
stu.sayHello();
}
}
输出结果为:hello
4、反射类中方法
如果要反射类中的方法,必须要先有对象。具体代码如下:
package com.fs.test;
public class Student {
public Student() {}
public void sayHello(String name) {
System.out.println("hello"+name);
}
}
package com.fs.test;
import java.lang.reflect.Method;
public class MyMain {
public static void main(String[] args)throws Exception{
//获取Student字节码文件
Class clazz = Class.forName("com.fs.test.Student");
//生成对象
Student stu = (Student)clazz.newInstance();
//获得方法对象
Method method = stu.getClass().getMethod("sayHello",String.class);
//反射方法
method.invoke(stu,"张三");
}
}
getMethod()函数第一个参数为要反射的方法的名称,第二个参数为该方法中参数的数据类型。
invoke()函数第一个参数为具体要反射哪个对象的方法,第二个参数为方法中的实际参数。
method.invoke(stu,"张三")相当于stu.sayHello("张三")
输出结果为:hello张三
以上是我对Java反射的一些理解,关注我,每天分享编程小知识
猜你喜欢
- 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反射机制(java 反射机制原理)
- 2024-09-12 实操讲解Java的反射机制,你要是再看不懂,神仙都没救了
- 2024-09-12 Java基础:Java的反射机制(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)
本文暂时没有评论,来添加一个吧(●'◡'●)