点进来的小伙伴,都是爱,要是再点个赞那就更感激不尽了。
一、反射的定义
- 官方的解释:
Java的反射( reflection )机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键
- 我的解释:
反射其实就是一面镜子,类的一个镜子,就像我们每天早上照的镜子,将类的所有情况都看的一清二楚,并将每个部分又单独的封装成一个各自的类,然后这面镜子就是类对象
如果感觉羞涩难懂,那你看看代码就明白了
二、反射常用的方法
- java代码的三个阶段
- 获取Class对象的方式
- Class对象的常见功能(API)
三、撸代码(都有解释)
(1) 获取类对象
Teacher类
package chen.com.reflex_study;
/**
* java反射的学习:
* author:放牛娃学编程
* 公众号:放牛娃学编程(精彩文章都在这)
*/
public class Teacher {
private String sex;
private int age;
private int height;
public int salary;
public int subject;
public Teacher(String sex, int age, int height) {
this.sex = sex;
this.age = age;
this.height = height;
}
public Teacher() { }
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getSubject() {
return subject;
}
public void setSubject(int subject) {
this.subject = subject;
}
@Override
public String toString() {
return "Teacher{" +
"sex='" + sex + '\'' +
", age=" + age +
", height=" + height +
", salary=" + salary +
", subject=" + subject +
'}';
}
public void run(int koilemeter) {
System.out.println("我可是"+koilemeter+"跑步冠军哟!");
}
}
获取构造器
package chen.com.reflex_study;
/**
* java反射的学习:
* author:放牛娃学编程
* 公众号:放牛娃学编程(精彩文章都在这)
*/
public class ReflexTest {
public static void main(String[] args) throws Exception {
// 获取类对象,有三种方式
/**
* 1. Class.forName(str), str时要反射类的全限定类名
* 2. 类名.class , 类名指的时需要反射的类名
* 3. 对象.getClass(), getClass()方法在Object类中定义
*/
// 1. Class.forName(str), str时要反射类的全限定类名
Class cls = Class.forName("chen.com.reflex_study.Teacher");
System.out.println("cls = " + cls);
System.out.println("-----------------");
// 2. 类名.class , 类名指的时需要反射的类名
Class cls2 = Teacher.class;
System.out.println("cls2 = " + cls2);
System.out.println("-----------------");
// 3. 对象.getClass(), getClass()方法在Object类中定义
Teacher teacher = new Teacher();
Class cls3 = teacher.getClass();
System.out.println("cls3 = " + cls3);
System.out.println((cls == cls2));
System.out.println((cls2 == cls3));
}
}
(2) 获取构造器
package chen.com.reflex_study;
import java.lang.reflect.Constructor;
/**
* java反射的学习:
* author:放牛娃学编程
* 公众号:放牛娃学编程(精彩文章都在这)
*/
public class ReflexTest02 {
public static void main(String[] args) throws Exception {
// 通过获取到的类对象,再获取其它相应的东西(比如成员变量,方法,构造器)
// 1. 获取构造器
/**
* a. Constructor<?>[] getConstructors()
* 返回一个数组包含 Constructor物体反射所有的 类对象表示的类的公共构造函数
* b. Constructor<T> getConstructor(类<?>... parameterTypes)
* 返回一个 Constructor对象反映指定的公共构造函数的 类对象表示的类。
* c. Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
* 返回一个 Constructor对象反映指定的构造函数的类或接口的 类对象表示。
* d. Constructor<?>[] getDeclaredConstructors()
* 返回 Constructor物体反射所有的构造函数通过 类对象表示的类中声明一个数组。
*/
Class teacherClass = Teacher.class;
// b. 获取构造器
Constructor constructor = teacherClass.getConstructor();
// 用构造器创建对象
Object o = constructor.newInstance();
System.out.println("o = " + o);
System.out.println("-----------------");
// b. 获取带参构造器
Constructor constructor1 = teacherClass.getConstructor(String.class, int.class, int.class);
Object o1 = constructor1.newInstance("老王八", 28, 180);
System.out.println("o1 = " + o1);
System.out.println("-----------------");
// d. 返回所有构造器函数
Constructor[] cons = teacherClass.getDeclaredConstructors();
for (Constructor con : cons) {
System.out.println(con);
}
}
}
(3) 获取成员变量
package chen.com.reflex_study;
import java.lang.reflect.Field;
/**
* java反射的学习:
* author:放牛娃学编程
* 公众号:放牛娃学编程(精彩文章都在这)
*/
public class ReflexTest03 {
public static void main(String[] args) throws Exception {
// 2. 获取成员变量
/**
* a. Field getField(String name)
* 返回一个 Field对象反映的类或接口的 类对象表示的指定公共成员。
* b. Field[] getFields()
* 返回一个数组包含 Field物体反射的类或接口的 类对象代表所有可访问的公共领域
* c. Field getDeclaredField(String name)
* 返回一个对象,反映了 Field指定声明字段的类或接口的 类对象表示。
* d. Field[] getDeclaredFields()
* 返回 Field物体反射所有字段的类或接口的 类对象表示声明数组。
*/
// 获取类对象
Class teacherClass = Teacher.class;
// b. Field[] getFields(), 私有的不能够访问
Field[] fields = teacherClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("-------------");
// d. Field[] getDeclaredFields()
Field[] fields1 = teacherClass.getDeclaredFields();
for (Field field : fields1) {
System.out.println(field);
}
// 用获取到的成员变量, 然后进行赋值操作
Field salary = teacherClass.getField("salary");
Teacher teacher = new Teacher();
// 获取值
Object o = salary.get(teacher);
System.out.println("teacher.getSalary() = " + o);
// 赋值
salary.set(teacher,5800);
System.out.println("teacher.getSalary() = " + teacher.getSalary());
System.out.println("-------------");
// 暴力反射(获取私有属性)
Field sex = teacherClass.getDeclaredField("sex");
sex.setAccessible(true);
sex.set(teacher,"female");
System.out.println("teacher.getSalary() = " + teacher.getSex());
}
}
(4)获取成员方法
package chen.com.reflex_study;
import java.lang.reflect.Method;
/**
* java反射的学习:
* author:放牛娃学编程
* 公众号:放牛娃学编程(精彩文章都在这)
*/
public class ReflexTest04 {
public static void main(String[] args) throws Exception {
// 获取成员方法
/**
* a. Method getMethod(String name, 类<?>... parameterTypes)
* 返回一个 方法对象反映的类或接口的 类对象表示的指定公共成员方法。
* b. Method[] getMethods()
* 返回一个数组包含 方法物体反射所有的类或接口的 类对象表示的公共方法,包括那些由类或接口的超类和超接口继承的声明。
* c. Method getDeclaredMethod(String name, 类<?>... parameterTypes)
* 返回一个 方法对象反映指定声明方法的类或接口的 类对象表示。
* d. Method[] getDeclaredMethods()
* 返回一个数组包含 方法物体反射所有声明的方法的类或接口的 类对象,代表包括公众、保护,默认(包)的访问,和私有方法,但不包括继承的方法。
*/
// 获取类对象
Class<Teacher> teacherClass = Teacher.class;
// b. Method[] getMethods()
Method[] methods = teacherClass.getMethods();
for (Method method : methods) {
System.out.println(method);
}
System.out.println("-------------------");
// 获取方法
Method method = teacherClass.getMethod("run", int.class);
// 执行方法
Teacher teacher = new Teacher();
method.invoke(teacher, 1000);
}
}
四、分享交流
最后有兴趣一起交流的,可以关注我的公众号:这里你能够学到很实用的技巧,不是常用的我不说,公众号回复提取码即可获取以下学习资料啦啦啦啦,喜欢就拿去吧!!
(链接时常会失效,若出现此类情况,可以加我微信:17722328325(加时请备注:学习资料))
-
Java web从入门到精通电子书
-
Python机器学习电子书
-
Python400集(北京尚学堂)
-
JavaScript项目案例、经典面试题
-
Java300集(入门、精通)
-
Java后端培训机构录集(同事培训内部提供)
-
java重要知识pdf文档(价值连城呀呀,不收藏你会后悔的)

喜欢就关注吧,点个赞吧