Java反射

首先来看一下java反射的定义:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。

怎么评价java反射,反射是框架的灵魂

java是一门静态的语言,但是通过反射有了动态的特性。那什么是动态语言,什么是静态语言?
动态类型语言,是指数据类型的检查是在运行时做的。
静态类型语言,是指数据类型的检查是在运行前(如编译阶段)做的。
什么意思?其实比较简单的理解,就是声明变量的方式。java中声明一个变量:

Demon demon = new Demon();
Integer intdemon = new Integer();
int a = 1;

demon是Demon类型的,intdemon 是Integer类型的,a是int类型的。再看动态语言:

var a = 1;

a是什么类型的?再看:

var a = 1;
var b=1.0;
var c =a +b;

c是什么类型的?
对于静态语言而言,类型总是已知的,而动态语言,很多变量只有在运行的时候才知道是什么类型。所以对于静态语言来说,借助IDE的帮助,你能规避很多错误。比如你不能new 一个不存在的对象,IDE会直接帮你找出来,找不到对应的类。但是动态语言是不能帮你找的。
java中新建对象用new方式是静态的方式,但是我们可以通过,反射reflect来进行动态的获取对象。

    public class ReflectServicelmp l {
        public void sayHello (String name) {
            System . err . println (” Hello ” + name) ;
        }
    }

反射获取对象

    public ReflectServiceimpl getinstance() {
    ReflectServiceimpl ob ] ect = null;
    try {
    object = (ReflectServiceimpl)
    Class.forName("全限定名").newInstance();
    }catch(Exception e){
        System.out.println(e.getMessage());
    }
    return object;
    }

这个时候你写错了全限定名,IDE也不会报错,为啥呢?因为这段逻辑是在代码运行的时候动态获取的。这也是动态获取的最直观感受。
也就是说我们这次通过反射获取到的这个对象,是通过获取类的全限定名,来创建对象的。是通过类信息创建对象的,进一步,是通过配置信息来获取类的对象的。
通过反射机制,我们从代码硬关联获取对象的方式,过渡到了读取配置信息,动态获取对象的方式。
试想一下,如果在代码中new对象A,现在改成new对象B,我必须把代码从A a = new A()改成B b = new B(),如果是反射,Class.forName("").newInstance()的模式是不需要改变的,需要考虑的只是配置信息也就是那个全限定的名的改变。这部分的信息,我们可以在配置里面读取,代码,是不需要改变的。当然还有类型转换的一些问题,但是并不是不能解决的。
这里你可能就知道了,反射是可以根据我们的提供的类信息去创建类对象的反射类对象后,可以继续用反射去调用方法。

    public Object reflect () {
    ReflectServiceimpl2 object = null;
    try {
    object = (ReflectServiceImpl2)
    Class.ForName("com.xxx.xxx.ReflectServiceImpl2").getConstructor(String . class}.newInstance("张三");
    Method method= object . getClass () . getMethod (” sayHello ”, String.class);
    method.invoke(object,"张三”);
    ) catch (Exception e){
    e.printStackTrace();
    }
    return object;
    }

假设有这样的类:

        package com.xxx.xxx ;
        public class ReflectServiceimpl2 {
        private String name;
        public ReflectServiceimpl2(String name) {
        this . name= name;
        public void sayHello(String name){
            System.out.println("hello"+name);
        }

我们根据类ReflectServiceimpl2的信息调用他的sayHello方法。
反射给我们打开了一道门,让我们可以通过类信息去创建对象,执行方法,如何利用好反射,我们还需要接着去看设计模式,看看反射是怎么被运用的。

可以看一看我写的springIoC。spring的解耦问题。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值