Java-反射

之前我们在创建对象时,一般都是在程序执行前编写好创建对象的代码,然后在进行执行,今天我们讲的反射则是,在程序执行过程中进行对象的创建和获取

反射的概念

反射(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);   //方法的实现,参数为被创建的额对象名
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值