作为第一次发博客的枚新码农☹
Java中的反射与现实中的反射
Java中的反射是动态获取类或对象信息以及动态调用对象方法的机制。
而我们生活中的反射,就像光,含义差别好大。
— 内涵
- 反射 ,对于任意一个类都能获取到它的所有成员变量和成员方法;
- 对于任意对象,都能访问它的任意 属性 和 方法,并能改变它的值 ;
And
- 获取类Class对象的三种方式:
①通过类的forName(“全限定名”)
②通过对象的getClass()方法
③通过类的Class属性
— 反射获取类的构造方法代码举例
通过Constructor 关键字
,反射获取类的构造方法。
package test01;
import java.lang.reflect.Constructor;
import java.util.Arrays;
/**
* @作者: YD
* @时间: 2019年9月19日
*/
public class ConstructorTest {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
// 获取类的class对象
Class cls = People.class;
// 1.获取public修饰的指定参数列表的构造方法
Constructor con = cls.getConstructor(String.class);
System.out.println("public修饰的有参构造:"+con);
// 2.获取非public修饰的指定参数列表的构造方法
Constructor nocon = cls.getDeclaredConstructor(String.class,int.class);
System.out.println(nocon);
// 3.获取所有public修饰的构造方法
Constructor[] cons = cls.getConstructors();
System.out.println(Arrays.toString(cons));
// 4.获取所有构造方法(包括非public)
Constructor[] dcons = cls.getDeclaredConstructors();
System.out.println(Arrays.toString(dcons));
}
}
作用
关键字(Constructor) | 作用 |
---|---|
getConstructor (参数列表) | 获取public修饰的指定参数列表的Constructor对象 |
getConstructors () | 获取所有public修饰的Constructor对象 |
getDeclaredConstructor (参数列表) | 获取非public修饰的指定参数列表的Constructor对象 |
getDeclaredConstructors () | 获取所有Constructor对象 (包括非public) |
反射获取成员变量
关键字(Field) | 作用 |
---|---|
getField (变量名) | 获取public修饰的指定参数列表的Field对象 |
getFields () | 获取所有public修饰的Field对象 |
getDeclaredField (变量名) | 获取非public修饰的指定参数列表的Field对象 |
getDeclaredFields () | 获取所有Field对象 (包括非public) |
反射获取成员方法
关键字(Method) | 作用 |
---|---|
getMethod (参数列表) | 获取public修饰的指定参数列表的Method对象 |
getMethods () | 获取所有public修饰的Method对象 |
getDeclaredMethod (参数列表) | 获取非public修饰的指定参数列表的Method对象 |
getDeclaredMethods () | 获取所有Method对象 (包括非public) |
通过的反射创建对象的方式:
- 通过class对象的newInstance()方法创建,(必须确保类中也有无参构造方法)
- 通过constructor对象的newInstance(Object…args)方法创建(既可以调用无参构造,也可以调用有参构造)
- 反射的作用:
动态加载
1.在运行时判断任意一个类的数据类型
2.在运行跟是创造任意一个类的对象
3.在运行时获取任意一个类的成员方法和成员变量
4.在运行是调用任意一个对象的方法
— 设计模式: 软件开发过程中共性问题的可重用解决方案
1. 外延
- 单例模式:确保一个类智能创建一个实例的设计模式
- 工厂模式
- 适配器模式
适配器:对象适配器,类适配器 - 代理模式:以扩展目标对象功能为摸底,通过代理类对象简洁操控目标对象的设计模式
外延:
静态代理:由自己编写代理类,由自己创建代理对象的代理模式
动态代理:通过反射在运行时动态创建代理对象的代理模式