网站首页 > 精选教程 正文
想起来之前之前面试过的一个程序员,我问了这样的一个问题,“你了解什么是反射机制吗?”
他说:“反射?不就是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反射的一些理解,关注我,每天分享编程小知识
- 上一篇: Java 反射 java反射获取属性值
- 下一篇: java反射机制详解 java反射机制实现原理
猜你喜欢
- 2024-11-13 十年Java工程师写下的Java反射使用总结
- 2024-11-13 一起来了解Java中的反射 java反射的步骤原理
- 2024-11-13 Java基础:反射机制,你用得多吗 java反射机制有什么用
- 2024-11-13 每日一点涨薪小知识-JAVA反射 java反射的理解
- 2024-11-13 不是吧,还有人连Java最强大的技术之一:反射还没搞懂?赶紧码住
- 2024-11-13 Java反射的原理以及应用场景 java中反射的实际用法
- 2024-11-13 浅谈java中的反射(恭喜FPX) java里的反射是什么
- 2024-11-13 实操讲解Java的反射机制,你要是再看不懂,神仙都没救了
- 2024-11-13 两分钟学会Java反射 java 反射
- 2024-11-13 三石说:java基础 之 反射 java反射的基石
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)