1.什么是反射
指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。
反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
反射提供了一种机制——用来检查可用的方法,并返回方法名.
人们想要在运行时获取类的信息的另一动机,便是希望提供在跨网络的远程平台上创建和运行类的能力.
——《Think In Java》第四版
反射用来干什么?
通过class文件对象:
- 使用该文件的成员变量
- 使用该文件的构造方法
- 使用该文件的成员方法
1.用反射获取class对象
//先准备一个Person类
package cn.lawfree_01;
public class Person {
private String name;
int age;
public String address;
//写四种构造方式
public Person() {
}
private Person(String name) {
this.name = name;}
Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public void show() {
System.out.println("show");
}
public void method(String s) {
System.out.println("method " + s);
}
public String getString(String s, int i) {
return s + "---" + i;
}
private void function() {
System.out.println("function");
}
@Override
public String toString() {
return "姓名:" + name + " 年龄:" + age + " 地址:" + address;
}
}
/**
* 反射:就是通过class文件对象,去使用该文件的成员变量,构造方法
*
* 通过class对象去干其他事儿,首先就必须得到class文件独享,其实也就是得到Class类的对象
* (Class类:
* 成员变量 Filed
* 构造方法 Constructor
* 成员方法 Method)
*
* 获取class对象的方式有三种:
* A:Object类的getClass()方法
* B:数据类型的静态属性class
* C:Class类中的静态方法
* public static Class<?> forName(String className)
*
* 一般选用哪一个?
* A:自己玩 任选一种,第二种比较方便
* B:开发 第三种
* 为什么?因为第三种是一个字符串,而不是一个具体类名,这样我们就可以把这样的字符串配置到配置文件中
*/
public