反射:将类的各个组成部分封装为其他对象,这就是反射机制
好处:
1.可以在程序运行过程中,操作这些对象
2.可以解耦,提高程序的可扩展性
获取Class对象的方法:
1.Class.forName("全类名")
:将字节码文件加载进内存,返回Class对象
(多用于配置文件,将类名定义在配置文件中。读取文件,加载类)
2.类名.class
: 通过类名的属性class获取
(多用于参数的传递)
3.对象.getClass()
: getClass() 方法在object类中定义着
(多用于对象的获取字节码的方式)
结论:同一个字节码文件(*.class
)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
Class对象功能:
获取功能:
1.获取成员变量们
Field[ ] getFields(); //获取所有public修饰的成员变量
Field getField(String name); //获取指定名称的public修饰的成员变量
Field[ ] getDeclaredFields(); //获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name);
2.获取构造方法们
Constructor<?> [ ] getConstructors();
Constructor<T> getConstructor(类<?>...parameterTypes); //参数为不同参数的Class对象 例String.class int.class
Constructor<?>[ ] getDeclaredConstructors();
Constructor<T> getDeclaredConstructor(类<?>...parameterTypes);
3.获取成员方法们
Method[ ] getMethods();
Method getMethod(String name, 类<?>...parameterTypes); //String name 方法名
Method[ ] getDeclaredMethods();
Method getDeclaredMethod(String name, 类<?>...parameterTypes); //类<?>...parameterTypes 可变参
4.获取类名
String getName();
注:暴力反射:
属性/方法对象.setAccessible(true);
例:
field.setAccessible(true);
constructor.setAccessible(true);
method.setAccessible(true);
暴力反射使用方法:
Class personClass=Person.class;
Field d = personClass,getDeclaredField("d");
d.setAccessible(true); //忽略访问权限修饰符的安全检查
Preson p = new Person();
Object value = d.get(p); //参数为Object
Field :成员变量 对象
操作:
1.设置值
void set (object obj, object value);
2.获取值
get (object obj);
Constructor:构造方法 对象
创建对象:
1. T newInstance(Object ...initargs);
2.如果使用空参数构造方法创建对象,操作可以简化:
personClass.instance();
实例:
1.Constructor constructor1 = personClass.getConstructor();
Object person1 = constructor1.newInstance();
2.Object person2 = personClass.newInstance();
Method:方法 对象
执行方法:
object invoke (Object obj, object ...args);
获取方法名称
String getName
:获取方法名
获取类名:
String className = personClass.getName; //全类名 (包名.类名)