1. 概述
反射:将类的各个组成部分封装为其他对象,可以在程序运行过程中操作这些对象,还可以解耦,提高程序的可扩展性。Java反射技术应用广泛,它能配置类的全限定名、方法和参数,完成对象的初始化,甚至反射某些方法。
2.获取Class对象的方式
* Class.forName(“全限定名”);将字节码文件加载进内存,返回Class对象。多用于配置文件,将类名定义在配置文件中。读取文件,加载类
* 类名.class:通过类名的属性class获取。多用于参数传递
* 对象.getClass():getClass()在Object类中定义着的。多用于对象获取字节码格式
代码演示:
package com.wanfei.domain;
/**
* 创建一个Student类:
*/
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
获取Class对象的三种方式的演示及物理地址比较:
public static void main(String[] args) throws ClassNotFoundException{
//使用Class.forName()
Class class_01 = Class.forName( "com.wanfei.domain.Student" );
System.out.println(class_01);
//使用 类名.Class
Class class_02 = Student.class;
System.out.println(class_02);
//使用对象名.getClass()
Class class_03 = new Student().getClass();
System.out.println(class_03);
//比较
System.out.println(class_01 == class_02); //true
System.out.println(class_01 == class_03); //true
/**
* 结论:同一个字节码文件(*.class)在一次程序运行过程中,
* 只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
*/
}
打印结果:
3.字节码对象Class的功能
1)获取成员变量们
- Field[] getFields() :获取所有public修饰的成员变量
- Field getField(String name) : 获取指定名称的成员变量
- Field[] getDeclaredFields() : 获取所有成员变量,不考虑修饰符
- Field getDeclaredField(String name)
2)获取构造方法们
- Constructor<?>[] getConstructors()
- Constructor getConstructor(类<?>… parameterTypes)
- Constructor getDeclaredConstructor(类<?>… parameterTypes)
- Constructor<?>[] getDeclaredConstructors()
3)获取成员方法们
- Method[] getMethods()
- Method getMethod(String name, 类<?>… parameterTypes)
- Method[] getDeclaredMethods()
- Method getDeclaredMethod(String name, 类<?>… parameterTypes)
4)获取全类名
String getName()
4.Field成员变量的使用:
修改Student.java文件中的内容
private String name;
private int age;
public String a;
public String b;
String c;
测试获取和设置成员变量:
public static void main(String[] args) throws Exception {
Class studentClass = Student.class;
System.out.println("------------- 获取public修饰的成员变量-----------------");
Field[] fields = studentClass.getFields();
for (Field f: fields) {
System.out.println(f);
}
System.out.println("------------- 获取所有成员变量-,不考录修饰符----------------");
Field[] fields2 = studentClass.getDeclaredFields();
for (Field f2: fields2) {
System.out.println(f2);
}
//获取指定的成员变量并设置值
Student student = new