java反射机制

本文详细介绍了Java反射机制的用途,如操作字节码文件、类加载器的工作原理和双亲委派机制,以及如何通过Class.forName()、对象.getClass()、类型.class属性等方式获取Class实例。此外,还讲解了通过反射机制实例化对象、访问类的属性和方法、以及类加载器的层次结构。Java反射机制在高级框架如SSH、SSM、Spring等中起到关键作用,对于理解框架底层原理至关重要。
摘要由CSDN通过智能技术生成

1、反射机制
    1.1、反射机制有什么用?
        通过java语言中的反射机制可以操作字节码文件。
        有点类似于黑客。(可以读和修改字节码文件。)
        通过反射机制可以操作代码片段。(class文件。)

    1.2、反射机制的相关类在那个包下?
        java.lang.reflect.*;

    1.3、反射机制相关的类有哪些?
        java.lang.Class                 代表字节码文件

        java.lang.reflect.Method        代表字节码中的方法字节码

        java.lang.reflect.Constructor   代表字节码中的构造方法字节码

        java.lang.reflect.Field         代表字节码中的属性字节码

        java.lang.Class:
            public class User{
                //Field
                int no;

                //Constructor
                public User(){
                }

                public User(int no){
                    this.no=no;
                }

                //Method
                public void setNo(int no){
                    this.no=no;
                }

                public int getNo(){
                    return no;
                }
            }

2、关于JDK中自带的类加载器:
    2.1、什么是类加载器?
        专门负责加载类的命令/工具。
        ClassLoader

    2.2、JDK中自带了三个类加载器
        启动类加载器
        扩展类加载器
        应用类加载器

    2.3、假设有一段代码
        String s="abc" ;

       代码在开始执行之前,会将所有的类全部加载到JVM当中。
       通过类加载器加载,看到以上代码类加载器会找String.class
       文件,找到就加载,那么是怎么进行加载的呢?

        首先通过“启动类加载器”加载
            注意:启动类加载器专门加载:E:\java tools\JDK8\jdk1.8.0_101\jre\lib\rt.jar
            rt.jar中都是JDK最核心的类库。

        如果通过“启动类加载器”加载不到的时候。
        会通过“扩展类加载器”加载。
        注意:扩展类加载器专门加载:E:\java tools\JDK8\jdk1.8.0_101\jre\lib\ext\*.jar

        如果通过“扩展类加载器”没有加载到的时候
        会通过“应用类加载器”加载。
        注意:应用类加载器专门加载:classpath中的类。

    2.4、java为了保证类加载的安全,使用了双亲委派机制。
        优先从启动类加载器中加载,这个称为“父”
        “父”无法加载的时候,再从扩展类加载器中
        加载,这个称为“母”。双亲委派。如果都加载
        不到,才会考虑从应用类加载器中加载,直到加载
        到为止。

 

 

要操作一个类的字节码,需要首先获取到这个类的字节码,怎么获取java.lang.Class实例?
    三种方式:
        第一种:Class c=Class.forName("完整的类名带包名");
        第二种:Class c=引用.getClass();
        第三种:Class c=任何类型.class属性

 

Class.forName()
    1、静态方法
    2、方法参数是一个字符串
    3、字符串需要的是一个完整类名
    4、完整类名必须带有包名。

c1=Class.forName("java.lang.String");     //c1代表String.Class文件,或者说c1代表String类

java中任何一个对象都有一个方法:getClass();

String s="abc";
Class x=s.getClass();

java语言中任何一种类型,包括基本数据类型,都有.Class属性。

Class z= String.class;

 

获取到Class,能干什么?
    通过Class的newInstance()方法来实例化对象。
    注意:newInstance()方法内部实际上调用了无参数构造方法,必须保证无参数构造存在才可以。

通过反射机制获取Class,通过Class来实例化对象

Class c=Class.forName("home.mjjhy.java.bean.User");

//重点是:newInstance()调用的是无参构造,必须保证无参构造是存在的。
Object obj=c.newInstance();//home.mjjhy.java.bean.User@6bdf2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值