* 反射:
* 定义:
* 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");
//获取构造方法
Constructor[] cons1 = c.getConstructors(); //获取所有公共构造方法
Constructor[] cons2 = c.getDeclaredConstructors(); //获取所有构造方法
//1、获取单个无参构造方法
Constructor con1 = c.getConstructor(); //返回的是工作方法对象
//使用Constructor对象表示的构造方法来创建该构造方法的声明类的新实例。
Object obj1 = con1.newInstance();
//2、获取带参构造方法对象
Constructor con2 = c.getConstructor(String.class,int.class,String.class);
//通过带参构造方法创建对象
Object obj2 = con2.newInstance("张三",17,"北京");
//3、获取私有构造方法并使用
Constructor con3 = c.getDeclaredConstructor(String.class);
//值为true则反射的对象在使用时会取消java语言访问检查
con3.setAccessible(true);
Object obj = con3.newInstance("张三");
}
}
/*
* 通过反射获取成员变量并使用
* 获取所有成员:getFields getDeclaredFields
* 获取单个成员:getField getDeclaredField
* 修改成员的值: set(Object obj,Object value) 将指定对象变量上此Field对象表示的字段设置为指定的新值。
*
* */
public class Reflect2 {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
//获取字节码文件对象
Class c = Class.forName("com.itheima_01.Person");
//获取所有的成员变量
Field[] fields1 = c.getFields();
Field[] fields2 = c.getDeclaredFields();
//通过无参构造方法创建对象
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");
//获取所有方法
Method[] methods1 = c.getMethods(); //获取自己的包括父类的公共方法
Method[] methods2 = c.getDeclaredMethods(); //获取自己的所有方法
Constructor con = c.getConstructor();
Object obj = con.newInstance();
//1、获取单个的方法并使用
Method m1 = c.getMethod("show"); //参数表示方法名
m1.invoke(obj); //调用obj对象的m1方法
//2、带参数的方法调用
Method m2 = c.getMethod("method", String.class);
m2.invoke(obj, "nihao");
//3、带参数并且有返回值的方法调用
Method m3 = c.getMethod("getString", String.class,int.class);
Object objString = m3.invoke(obj, "nihao",100);
//4、私有方法的访问
Method m4 = c.getDeclaredMethod("function");
m4.setAccessible(true);
m4.invoke(obj);
}
}
|
|