版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fhm6100411074/article/details/79777130
JAVA反射机制:
1、指的是可以于运行时加载、探知、使用编译时完全未知的类
2、程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
3、一个类被加载后,JVM会创建一个对应该类的Class对象,类的整个结构信息会放在对应的Class对象中,这个Class对象就像一面镜子,通过这面镜子我们就可以看到类的全部信息
一、Class类对象的三种生成方式:
1、Student student= new Student();
Class class1 = student.getClass();
2、Class class2 = Student.class;
3、Class class3 = Class.forName("包名.类名");
在运行期间,一个类,只有一个Class对象产生。
三种方式常用第三种,第一种对象都有了还要反射干什么。第二种需要导入类的包,依赖太强,不导包就抛编译错误。一般都第三种,一个字符串可以传入也可写在配置文件中。
二、例子
package com.sh.fhm.MavenTest.reflect;
public class Student {
private String name = "周杰伦";
private Integer age = 28;
public Student() {}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "bean [name=" + name + ", age=" + age + "]";
}
}
测试类:
package com.sh.fhm.MavenTest.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws Exception {
Class<?> clz = Class.forName("com.sh.fhm.MavenTest.reflect.Student");
/*
* 两种方式调用无参的构造方法
*/
Student student = (Student) clz.newInstance();
System.out.println(student.toString());
Constructor<?> constructor1 = clz.getConstructor();
student = (Student) constructor1.newInstance();
System.out.println(student.toString());
/*
* public Constructor<T> getConstructor(Class<?>... parameterTypes(构造方法的参数类型))
* public T newInstance(Object ... initargs(构造方法的参数值))
* 调用带参数的构造方法
*/
Constructor<?> constructor = clz.getConstructor(String.class, Integer.class);
student = (Student) constructor.newInstance("张三", 23);
System.out.println(student.toString());
/*
* public Method getMethod(String name(方法名), Class<?>... parameterTypes(方法的参数类型))
* public Object invoke(Object obj(类的实例), Object... args(方法的参数值))
*/
Method method = clz.getMethod("setName", String.class);
method.invoke(student, "李四");
method = clz.getMethod("getName");
System.out.println(method.invoke(student));
}
}