之前我们在创建对象时,一般都是在程序执行前编写好创建对象的代码,然后在进行执行,今天我们讲的反射则是,在程序执行过程中进行对象的创建和获取
反射的概念
反射(Reflection)是计算机编程中的一种机制,允许程序在运行时动态获取类型信息(如类、方法、属性等),并操作这些信息。通过反射,程序可以绕过编译时的静态类型检查,实现动态加载、调用或修改代码行为。
通过反射创建对象
1.获取Class对象
获取Class对象有三种方法,如下
//获取Class对象
//1.类名.class获取Class对象
Class stu1= Student.class;
//2.Class.forName(全类名)获取Class对象
Class stu2=Class.forName("reflect.Student");
//3.对象名.getClass()获取Class对象
Class stu3=new Student().getClass();
这三种方法获取到的Class对象完全一样,值得注意的是用第二种方法时,我们要注意
参数要写成全类名。
(全类名(Fully Qualified Name,FQN)是指一个类、接口或成员在编程语言中的完整路径名称,包含其所属的包或命名空间信息。全类名的作用是避免命名冲突,确保在代码中能够唯一标识一个类或成员。)
全类名的组成
包名:类的上层命名空间,通常以逆域名形式表示(如 com.example)。
类名:类的实际名称(如 MyClass)。
成员名(可选):如果是类的成员(如方法或字段),需进一步指定。
2.获取构造方法对象
当我们用反射来获取构造方法时,我们需要用到getConstructor()方法,如下
//获取构造方法对象
Constructor constructor=stu1.getConstructor(String.class,int.class);
//用获得的构造方法来创造对象,而且必须进行强制类型转换
Student stu=(Student) constructor.newInstance("张三",20);
System.out.println(stu.getAge()+stu.getName());
getConstructor里面的参数为被创建对象的有参构造方法中的有参,然后把他们也转换成Class对象。
在用获得的构造方法来创建对象时**,必须要用强制类型转换**
3.获取对象的public属性
//获取public属性
Field field= stu3.getField("name");//参数为被获得的属性名
field.set(stu,"666");//第一个参数为已经被创建完成的对象名,第二个为此对象的属性的赋值
4.获取对象的其他权限的属性
//获取其他权限的属性
Field field2=stu3.getDeclaredField("name");//参数为被获得的属性名
field2.setAccessible(true);//设置能否更改
field2.set(stu,"王五");//第一个参数为已经被创建完成的对象名,第二个为此对象的属性的赋值
5.获取对象的普通方法
//获取方法
Method method=stu2.getMethod("study");//参数为想要得到的方法名
method.invoke(stu); //方法的实现,参数为被创建的额对象名
全部代码如下:
public class Student {
private String name;
private int age;
public Student(){
}
public Student(String name,int age){
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;
}
public void study(){
System.out.println(name+"正在学习");
}
}
public class Execution {
public static void main(String[] args) throws Exception {
//获取Class对象
//1.类名.class获取Class对象
Class stu1= Student.class;
//2.Class.forName(全类名)获取Class对象
Class stu2=Class.forName("reflect.Student");
//3.对象名.getClass()获取Class对象
Class stu3=new Student().getClass();
System.out.println(stu1);
System.out.println(stu2);
System.out.println(stu3);
//获取构造方法对象
Constructor constructor=stu1.getConstructor(String.class,int.class);
Student stu=(Student) constructor.newInstance("张三",20);//用获得的构造方法来创造对象,而且必须进行强制类型转换
System.out.println(stu.getAge()+stu.getName());
//获取public属性
// Field field= stu3.getField("name");//参数为被获得的属性名
// field.set(stu,"666");
//获取其他权限的属性
Field field2=stu3.getDeclaredField("name");//参数为被获得的属性名
field2.setAccessible(true);//设置能否更改
field2.set(stu,"王五");//第一个参数为已经被创建完成的对象名,第二个为此对象的属性的赋值
//获取方法
Method method=stu2.getMethod("study"); //参数为想要得到的方法名
method.invoke(stu); //方法的实现,参数为被创建的额对象名
}
}

被折叠的 条评论
为什么被折叠?



