反射学习

了解反射

为什么要用反射?
如果一个类的属性和方法不想在外部被访问时,我们只需将其设置为private或者protected即可,那有些情况下我们还需要访问类中私有的方法如何操作?
这个时候就需要用的反射了,那么什么是反射呢?
反射的概念
Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。
所有类中的属性和方法,不论是private还是protected,在反射机制面前都无所遁形,赤裸裸的暴露出来。就像一个照妖镜一样,让所有的妖怪原型毕露。

反射的基石

反射的基石是字节码文件对象
.Java源文件是不能直接运行的,.java源文件在编译之后形成字.class的字节码文件,然后使用双亲委派模式被类加载器加载之后形成字节码文件对象,才可以在JVM中运行。
以下方式会触发类的加载:

  1. new一个对象的时候
  2. 访问一个类静态成员的时候
  3. 调用一个类静态方法的时候
  4. 通过反射的方式创建一个类的字节码对象的时候
  5. 创建一个子类对象的时候
  6. java命令执行一个字节码文件的时候
    在Java中,一切皆对象,当字节码文件加载到JVM中后,会形成一个Class类对象,即:该类在JVM中变成了一个
    对象(注意与new T()创建的对象不同)。
    字节码文件对象中包含了三部分内容:
    构造方法—>Constructor对象
    成员方法—>Method对象
    成员变量—>Filed对象

反射的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public class Student {

    private String name;
    private String gender;
    private int age;

    public Student(String name,String gender,int age){
        this.name=name;
        this.gender=gender;
        this.age=age;
    }

    private Student(String name){
        this.name=name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }
}

这是先定义一个类,来获取它的私有构造方法修改属性

import java.lang.reflect.Constructor;

public class TestReflact {
    public static void main(String[] args) {
        test1();
    }

    public static void test1(){
        try {
            //获取字节码文件对象
            Class<?> c = Class.forName("Student");
            //获取构造器对象
            Constructor<?> con=c.getDeclaredConstructor(String.class);
            //因为构造方法是私有的,因此要设置构造器的权限为true
            con.setAccessible(true);
            Student s = (Student)con.newInstance("呆萌萌");
            System.out.println(s);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}


反射的优缺点
优点:
1. 对于任意一个类,可以知道该类的所有属性和方法;对于
任意一个对象,都能调用它的任意一个方法
2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力
3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等
缺点:
1. 使用反射会有效率问题。会导致程序效率降低
2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂 。
那么是不是所有的类都可以用反射呢?答案是不是的,枚举就不行。
这里就不具体说枚举了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值