【Java SE】反射 Reflect

反射,它就像是一种魔法,引入运行时自省能力,赋予了 Java 语言令人意外的活力,通过运行时操作元数据或对象,Java 可以灵活地操作运行时才能确定的信息。而动态代理,则是延伸出来的一种广泛应用于产品开发中的技术,很多繁琐的重复编程,都可以被动态代理机制优雅地解决。

反射一般很少使用,基本都是在封装框架的时候会用到,我们可以根据反射获取对象内容信息(属性,方法),从而生成API文档,既然可以获取所有对象的内容,我们可以做插件功能,获取里面的方法,随意调用,当然也有缺点,本该有的封装性会被破坏。

  • 提问:什么是反射?
    反射就是【动态加载对象】,并对对象进行剖析。
    在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    对于任意一个对象,都能够调用它的任意一个方法;
    这种动态获取信息以及动态调用对象方法的功能成为Java反射机制。

  • 提问:反射的优缺点?
    优点:
    反射提高了程序的灵活性和扩展性,在底层框架中用的比较多,业务层面的开发过程中尽量少用。
    缺点:
    性能不好
    反射是一种解释操作,用于字段和方法接入时要远慢于直接代码;
    程序逻辑有影响
    使用反射操作会模糊化程序的内部逻辑,从代码的维护角度来讲,我们更希望在源码中看到程序的逻辑,反射相当于绕过了源码的方式,因此会带来维护难度比较大的问题。

  • 提问:反射的使用场景有哪些?
    实现RPC框架;
    实现ORM框架;
    拷贝属性值(BeanUtils.copyProperties);
    ——————————————————————

例子:

public class Student {
    private long id;
    private String name;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

获取类中的所有方法

public static void main(String[] args) {
    try {
        Class<?> clz = Class.forName("fs.Student");
        Method[] methods = clz.getMethods();
        for (Method method : methods) {
            System.out.println("方法名:" + method.getName());
        }
    } catch (ClassNotFoundException e) {
            e.printStackTrace();
    }
}

如果只需要获取加载类中的方法,不要父类的方法,可以使用下面的代码:
Method[] methods = clz.getDeclaredMethods();

通过反射来【调用方法】:

try {
    Class<?> clz = Class.forName("fs.Student");
    Student stu = (Student) clz.newInstance();
    System.out.println(stu.getName());
    Method method = clz.getMethod("setName", String.class);
    method.invoke(stu, "名字");
    System.out.println(stu.getName());
} catch (Exception e) {
    e.printStackTrace();
}

获取类中的所有属性

Class<?> clz = Class.forName("fs.Student");
Field[] fields = clz.getFields();
for (Field field : fields) {
    System.out.println("属性名:" + field.getName());
}


Class类的使用

  • 1.在面向对象的世界里,万事万物皆对象

但在Java

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值