反射
什么是反射
将类的各个组成部分封装为其他对象,这就是反射机制
好处
-
可以在程序运行过程中,操作这些对象
-
可以解耦,提高程序的可扩展性
获取Class对象的方式:
-
Class.forName("全类名"); 将字节码文件加载内存,返回Class对象(Source源代码阶段)
* 多用户配置文件 将类名定义在配置文件中,读取文件,加载类
-
类名.class 通过类名的属性获取
* 多用于参数的传递
-
对象.getClass(); getClass() 在Object
-
结论 同一个字节码文件(*.class)在一次程序运行过程中,自会加载一次,无论通过哪一种方式获取的Class对象都是同一个
// 1. Class.forName("全类名");
Class studentClass1 = Class.forName("com.lvsheng.fanshe.Student");
//2.类名.class 通过类名的属性获取
Class studentClass2 = Student.class;
// 3. 对象.getClass(); getClass() 在Object
Student studentClass3 = new Student();
Class aClass1 = studentClass3.getClass();
System.out.println(studentClass1); //class com.lvsheng.fanshe.Student
System.out.println(studentClass2); //class com.lvsheng.fanshe.Student
System.out.println(studentClass3); //class com.lvsheng.fanshe.Student
System.out.println("------------------");
System.out.println(studentClass1==studentClass2); //true
Class对象的功能
-
获取成员的变量
-
获取构造方法
-
获取成员方法
-
获取类名
Class studentClass = Student.class;
//Field 成员变量
Field[] fields = studentClass.getFields(); //只会获取public修饰的成员变量
for (Field field : fields) {
System.out.println(field);
}
Field a = studentClass.getField("a"); //获取名字为a 并且是public修饰的成员变量
Student student=new Student();
a.set(student,"张三"); //给student对象 变量名为a的复制张三 public修饰
System.out.println(student);
Field[] declaredFields = studentClass.getDeclaredFields(); //获取所有的成员变量 不考虑修饰符
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
Field name = studentClass.getDeclaredField("name");
Student student1=new Student();
name.setAccessible(true); //暴力反射
Object o = name.get(student1); //当get有访问权限的的成员变量 会报 IllegalAccessException异常
System.out.println(o);
//获取构造
Constructor constructor = studentClass.getConstructor(); //无参构造
System.out.println(constructor);
Object o = constructor.newInstance(); //通过构造 获取对象
System.out.println(
