1 反射介绍
- 概念
反射是被视为动态语言的关键,反射机制允许程序在执行期间借助于反射的aPI取得任何类的内部信息,并能直接操作任意对象的内部属性和方法
在加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的结构信息,我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构
java是一门静态语言,就是因为有了反射才让java具有了动态性
java反射提供了哪些功能?
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员变量和方法
- 在运行时处理注解
- 动态代理
2 入门演示
package study.wyy.java.model;
public class Person {
public String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
比如有上面这么一个类,我们通常是是这样使用的
@Test
public void test01(){
Person kobe = new Person("kobe", 18);
String s = kobe.toString();
System.out.println(s);
// 这种方式不能调用类的私有属性和方法
System.out.println("name: " + kobe.name);
}
通过反射创建这个类的对象
@Test
public void test02() throws Exception {
Class personClass = Person.class;
// 获取构造
Constructor constructor = personClass.getConstructor(String.class, Integer.class);
Person kobe = (Person) constructor.newInstance("kobe", 18);
// 调用age属性
Field name = personClass.getDeclaredField("name");
name.set(kobe,"wade");
// 调用方法
Method toString = personClass.getDeclaredMethod("toString");
String invoke = (String) toString.invoke(kobe);
System.out.println(invoke);
}
Person{name='wade', age=18}