* 反射:
* 定义:
* java反射机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性和方法;
* 对于任意一个对象,都能够调用它的任意一个方法和属性;
* 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制
*
* 想要解剖一个类,必须先要获取到该类的字节码文件。而解剖使用的就是Class类中的方法,
* 所以先要获取到每一个字节码文件对应的Class类型的对象。
*
* 简单的说,反射就是通过class文件对象,去使用该文件中的成员变量,构造方法,成员方法。
* Class类:
* 成员变量: Field
* 构造方法: Constructor
* 成员方法: Method
*
* 一、获取Class文件对象的三种方式:
* 1、Object类的getClass()方法
* Person p = new Person();
* Class c = p.getClass();
*
* 2、数据类型的静态属性class
* Class c = Person.class;
*
* 3、Class类中的静态方法
* Class c = Class.forName("Person");
*
* 开发中常用的获取方式是第三种,因为第三种是一个字符串,而不是一个具体的类名。这样我们就可以把
* 字符串配置到配置文件中。
*
* 二、通过反射获取构造方法并使用
*
*
*
*
*
* */
import java.lang.reflect.*;
public class Reflect {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//获取字节码文件对象
Class c = Class.forName("com.itheima_01.Person");
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//获取字节码文件对象
Class c = Class.forName("com.itheima_01.Person");
//通过无参构造方法创建对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//1、获取单个的成员变量
Field addressField = c.getField("address");
addressField.set(obj,"北京"); //将指定对象变量上Field对象表示的字段设置为指定的新值
//2、获取name并对其赋值
Field nameField = c.getField("name");
nameField.setAccessible(true);
nameField.set(obj, "张三");
//3、获取age并对其赋值
Field ageField = c.getField("age");
ageField.setAccessible(true);
ageField.set(obj,"27");
}
}
/*
* 通过反射获取成员方法并使用
* 获取所有方法:getMethods getDeclaredMethods
* 获取单个方法:getMethod getDeclaredMethod
* 暴力访问:method.setAccessible(true)
*
* */
public class Reflect3 {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//获取字节码文件对象
Class c = Class.forName("com.itheima_01.Person");