反射概述:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
GetClass {
/*
* Class类就是描述class文件对象的类
*
* 获取class文件对象的三种方式
* 1.Object类中的方法getClass Class<?> getClass() 返回此 Object
* 的运行时类。
* 2.通过类名的属性获取 每种数据类型(基本,引用),都会赋予该类型一个calss属性,作用就是获取class文件对象
* 3.Class类中的静态方法forName static Class<?> forName(String className)
* 返回与带有给定字符串名的类或接口相关联的 Class 对象。
*
* 注意:class文件对象,一个类只会产生一个
*/
public static void main(String[] args) throws Exception {
// 1.Object类中的方法getClass Class<?> getClass()
Bean bean = new Bean();
Class c1 = bean.getClass();
System.out.println(c1);
// 2.通过类名的属性获取
Class c2 = Bean.class;
System.out.println(c2);
// 3.Class类中的静态方法forName(使用的最多的)
Class c3 = Class.forName("com.simon.Bean");
System.out.println(c3);
}
}
GetEmptyConstructor { //快速获取空参构造
/*
* 使用反射技术快速获取空参构造方法的对象 使用的前提:
* 1.获取的类中必须有空参数构造方法
* 2.空参数构造方法权限不能私有的,建议使用public,使用方便
*
* 使用Class类中的方法 T newInstance() 创建此 Class 对象所表示的类的一个新实例。
*/
public static void main(String[] args) throws Exception {
Class c1 = Class.forName("com.simon.Bean");
Object object = c1.newInstance();
System.out.println(object);
}
}
GetConstructor { //获取构造函数
/*
* 使用反射获取类中的构造方法
*
* 使用步骤:
* 1.获取class文件对象
* 2.通过class文件对象中提供的方法,获取类中的构造方法
* 3.把获取到的构造方法初始化执行
*/
public static void main(String[] args) throws Exception {
// 1.获取class文件对象
Class c1 = Class.forName("com.simon.Bean");
// 2.通过class文件对象中提供的方法,获取类中的构造方法
Constructor[] constructors = c1.getDeclaredConstructors();
for (Constructor constructor : constructors) {
// 取消Java的访问权限检查-->暴力反射(不推荐,破坏了类的封装性)
constructor.setAccessible(true);
}
Object object = constructors[1].newInstance("hello world", 100);
System.out.println(object);
}
}
GetMembers { //获取成员变量
/*
* 使用反射技术获取Bean类中的成员变量
*
* 使用步骤:
* 1.获取class文件对象
* 2.通过class文件对象中提供的方法,获取类中的成员变量(字段)
* 3.可以使用字段Field中的方法,设置字段的值,获取字段的值
*/
public static void main(String[] args) throws Exception {
// 1.获取class文件对象
Class c1 = Class.forName("com.simon.Bean");
// 获取所有成员变量
Field[] fields = c1.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
// 获取指定成员变量
Field fieldName = c1.getDeclaredField("name");
// 设置可访问私有成员变量
fieldName.setAccessible(true);
// 获取对象
Object obj = c1.newInstance();
// 赋值
fieldName.set(obj, "lily");
// 取值
Object object = fieldName.get(obj);
System.out.println(object);
}
}
GetMethods { //获取方法
/*
* 使用反射技术获取类中的成员方法
*
* 使用步骤:
* 1.获取class文件对象
* 2.通过class文件对象中提供的方法,获取类中的成员方法(Method)
* 3.可以使用字段Method中的方法,运行获取到的方法
*/
public static void main(String[] args) throws Exception {
// 1.获取class文件对象
Class clazz = Class.forName("com.simon.Bean");
// 2.通过class文件对象中提供的方法,获取类中的成员方法(Method)
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
// System.out.println(method);
}
// 获取指定的成员方法
Method getName = clazz.getDeclaredMethod("getName");
System.out.println(getName);
Method setName = clazz.getDeclaredMethod("setName", String.class);
System.out.println(setName);
// 获取bean类对象
Object obj = clazz.newInstance();
Object setNameObj = setName.invoke(obj, "Lily");
Object getNameObj = getName.invoke(obj);
System.out.println(getNameObj);
}
}