程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

面试中关于反射的知识

发布于2021-05-29 21:57     阅读(1249)     评论(0)     点赞(26)     收藏(0)


反射的定义:

在java中,除了可以使用new创建对象外,还可以使用反射来创建对象,所以java反射的作用可以创建获取一个类,包括它的属性和方法,但前提条件是在运行情况下并且知道类的名字,就可以通过反射机制来获得类的所有信息。这种动态的获取信息以及动态调用对象的方法的功能称为java语言的反射机制.

反射的原理:

java中类的执行要先进行编译,java文件编译生成.class字节码文件

这个.class字节码文件中包含了类的所有信息

之后就是类加载器根据类的全限定类名来读取在class文件中的二进制文件到jvm中,并保存在运行时内存区中

反射就是通过这个.class文件来获取对象的属性和方法的内存地址,从而知道其对象的属性和方法.

反射中获取Class对象的方法有四种:

1.Class.forName(“类的路径”);

2.类名.class

3.对象名.个体class();

4.基本类型的包装类,可以调用包装类的Type属性来获取该包装类的Class对象.

一个典型的反射应用就是我们jdbc中的

Class.forName(“com.mysql.jdbc.Driver.class”);

为什么会使用反射来加载驱动主要原因是:

通过new com.mysql.jdbc.Driver()的话会对类产生依赖,后续更换数据库驱动,就要修改代码,而使用反射只需要修改xml文件中的配置,目的是为了解耦.

反射的使用场景:

通过反射获取无法访问的类

调用不可访问的方法

简化代码,可以直接获取类的属性,不用过多的书写get方法

使用反射的优点就是:

在运行时动态的获取对象的属性,提高程序的灵活性和扩展性,在底层的框架中使用频繁,但在业务层较少.

因为其缺点就是其性能不好,通过反射时,先找查找类资源,使用类加载器创建,过程比较繁琐,所以效率较低

Class具有的部分方法如下:

getName():获得类的完整名字。

getFields():获得类的public类型的属性。

getDeclaredFields():获得类的所有属性。包括private 声明的和继承类

getMethods():获得类的public类型的方法。

getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类

getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。

getConstructors():获得类的public类型的构造方法。

getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。

newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

使用反射创建对象的demo

通过反射获取单例模式中的对象,破坏单例模式

//这是一个单例模式

public class Singleton {
    //饿汉式,会在开始就创造对象
   private static Singleton instance = new Singleton();
    private Singleton(){

    }
    public static Singleton getInstance(){
        return  instance;
    }
}

import java.lang.reflect.Constructor;

public class test1 {
    public static void main(String[] args) throws Exception{
        Singleton s1  = Singleton.getInstance();//获取clas对象
        //获取构造器
        Constructor<Singleton> constructor = Singleton.class.getDeclaredConstructor();
          //设置权限
            constructor.setAccessible(true);
         //通过newInstance()创建一个新的对象
            Singleton s2 = constructor.newInstance();
        System.out.println(s1.hashCode());
        System.out.println(s2.hashCode());
    }
}

在这里插入图片描述

原文链接:https://blog.csdn.net/weixin_43950187/article/details/117280297



所属网站分类: 技术文章 > 博客

作者:我长得真不赖

链接:http://www.javaheidong.com/blog/article/207729/f3c532702ea73f1772f5/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)