对于Java的反射机制,精炼一点就是,可以在程序运行时获取类和对象的信息,包括属性和方法。
反射基础
Class类
和普通的类没有什么区别,有属性,有方法。
我们编写的类在被编译后,都会附带一个Class对象,表示创建类的类型信息,被写入在同名的class字节码文件中。
我们无法手动创建Class类的对象,因为其构造函数是私有化的。
Class对象的作用是运行时提供某个对象的类型信息。
反射的使用
对于对象,我们的常规操作是什么?
无非就是new一个对象出来、改变对象的状态(修改属性值)、调用对象方法。
不过,现在,我们要使用反射机制来完成这些操作。
Class类对象的获取
在类加载的时候,jvm会创建一个class对象。
获取class对象的三种方式:
- 类名.class
- 对象.getClass()
- Class.forName(全限定类名)
(这里简单演示一下就行了,毕竟平时开发的时候真的很少用这玩意儿啦)
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private void sayHello(){
System.out.println("hello");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
创建一个新的对象:
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Constructor<Person> constructor = Person.class.getDeclaredConstructor(String.class,int.class);
Person person = constructor.newInstance("kaiven",20);
System.out.println(person);
}
}
改变对象的状态:
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Person person = new Person("kaiven", 20);
Field namField = person.getClass().getDeclaredField("name");
namField.setAccessible(true);
namField.set(person, "lucy");
System.out.println(person.getName());
}
}
调用对象方法:
public class Test {
public static void main(String[] args) throws NoSuchMethodException, SecurityException, InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Person person = new Person("kaiven", 20);
Method method = person.getClass().getDeclaredMethod("sayHello");
method.setAccessible(true);
method.invoke(person);
}
}
(想玩儿的时候自己去查阅文档玩儿一下就行了)
反射机制执行的流程
(等我去搞一下JVM,哈哈。先欠着,以后还。)
2024.10.25
writeBy kaiven