一、反射概述
程序通过类创建对象,反射将这一过程进行反转,通过实例化对象来获取所属类的信息。
1.作用
在程序运行状态时,构造任意一个类的对象、获取任意一个对象所属的类的信息、调用任意一个类的成员变量和方法、获取任意一个对象的属性和方法。
2.优点
可以在程序运行期间动态的创建和编译对象,不需要再次重新编译,就可以更新。
二、Class类
1.获取Class对象的三种方法
1.Class.forName("全类名")
将字节码文件加载进内存,返回Class对象
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class Student {
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls1=Class.forName("itcast.Student");
System.out.println(cls1);
}
}
3.执行结果
相关报错
Exception in thread "main" java.lang.ClassNotFoundException
原因:
Class.forName()里的包或类写错了
解决方法
复制获取Class对象的类和包,粘上去
2.类名.class
通过类名的属性class获取
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class cls1=Student.class;
System.out.println(cls1);
}
}
3.执行结果
3.对象.getClass()
1.举例
定义一个Student类,获取Class对象
2.代码
package itcast;
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Student stu=new Student();
Class cls1=stu.getClass();
System.out.println(cls1);
}
}
3.执行结果
2.获取功能
1.获取成员变量
操作
1.设置值
set(Object obj,Object value)
2.获取值
get(Object obj)
getFields()
获取所有public修饰的的成员变量
代码
package itcast;
public class Student {
public String name;
public int age;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = 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;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
package itcast;
import java.lang.reflect.Field;
public class ReflectDemo {
public static void main(String[] args){
Class StudentClass=Student.class;
Field[] field=StudentClass.getFields();
for (Field field2 : field) {
System.out.println(field2);
}
}
}
执行结果
getField(String name)
指定名称的public修饰的成员变量
getDeclaredFields()
获取所有的的成员变量,不考虑修饰符
getDeclaredField(String name)
指定名称的成员变量,不考虑修饰符
2.获取构造方法
创建对象
T newInstance(Object... initargs)
如果使用的是无参构造方法创建对象,使用Class对象的newInstance
getConstructors()
代码
package itcast;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
public class ReflectDemo {
public static void main(String[] args) throws Exception{
Class StudentClass=Student.class;
Constructor constructor=StudentClass.getConstructor(String.class,int.class);
System.out.println(constructor);
Object student1=constructor.newInstance("老六",18);
System.out.println(student1);
Object student2=StudentClass.newInstance();//无参函数时使用
System.out.println(student2);
}
}
执行结果
getConstructor(类<?>... parameterTypes)
getDeclaredConstructor(类<?>... parameterTypes)
getDeclaredConstructors()
3.获取成员方法
getMethods()
getMethod(String name,类<?>... parameterTypes)
getDeclaredMethods()
getDeclaredMethod(String name,类<?>... parameterTypes)
4.获取类名
getName()