微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java反射机制详解——获取class的三种方式

一、反射机制概述

1、反射机制的作用:

​              通过Java语言中的反射机制可以操作字节码文件

可以读和修改字节码文件(类似于黑客)

Java中,反射是一种强大的工具。

 2、Java反射机制相关类在:java.lang.reflect

3、反射机制相关的重要的类有:

java.lang.class:代表整个字节码。class文件

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

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

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

 4、必须掌握的重点就是:

其它的只需要了解就行。

二、获取class的三种方式

其最重要的一个作用就是可以动态地创建类的对象,获取方法如下

第一种方式:通过Class c1 = Class.forName("java.lang.String");

  • public static 类<?> forName(String className)
    • 返回与具有给定字符串名称的类或接口关联的对象。

public class test03{
    public static void main(String args[]){
        /*Class.forName:
        *       1、静态方法
        *       2、方法的参数是String类型的
        *       3、字符串必须是一个完整的类名,即必须带有包名*/
        Class c1 = null;
        try {
            c1 = Class.forName("java.lang.String");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        System.out.println(c1);//c1代表String.class文件,或者说c2代表String类型
        //class java.lang.String
    }
}

第二种方式:通过Class x = 对象.getClass();

import java.util.Date;
public class test03{
    public static void main(String args[]){
        Class c1 = null;
        Class c2 = null;
        try {
            c1 = Class.forName("java.lang.String");
            c2 = Class.forName("java.util.Date");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        System.out.println(c1);
        
        //第二种方式:Java中任何一个对象都有一个方法:get.class()
        String s = "abc";
        Class x = s.getClass(); //x代表String.class文件,或者说x代表String类型
        System.out.println(x==c1);//true(==比较的是内存地址,说明两个的内存地址是一样的)
        Date date = new Date();
        Class y = date.getClass();
        System.out.println(y==c2);//true
 //(y和c2两个变量中保存的内存地址都是一样的,都指向方法区中的字节码文件)
    }
}

第三种方式:Java语言中 任何一种数据类型(包括基本数据类型),都有一个.Class属性

Class c= 任何类型.class;

import java.util.Date;
​
public class test03{
    public static void main(String args[]){
        Class c1 = null;
        Class c2 = null;
        try {
            c1 = Class.forName("java.lang.String");
            c2 = Class.forName("java.util.Date");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
        System.out.println(c1);//c1代表String.class文件,或者说c1代表String类型
        //输出:class java.lang.String
        //第二种方式:Java中任何一个对象都有一个方法:get.class()
        String s = "abc";
        Class x = s.getClass(); //x代表String.class文件,或者说x代表String类型
        System.out.println(x==c1);//true(==比较的是内存地址,说明两个的内存地址是一样的)
        Date date = new Date();
        Class y = date.getClass();
        System.out.println(y==c2);//true
​
        //第三种方式:Java语言中 任何一种数据类型(包括基本数据类型),都有一个.Class属性
        Class z = String.class;
        Class w = int.class;
        System.out.println(z==x);//true
    }
}

 

在反射机制中,Class是一个非常重要的类,那么如何才能获取Class类呢?总共有以下三种方法可以获取

1)Class.forName("类的路径")

2)类名.Class

3)实例.getClass()

三、面试题

Java创建对象的方式总共有以下几种:

1)通过new语句实例化一个对象

2)通过反射机制创建对象

3)通过clone()方法创建对象

4)通过反序列化的方式创建对象

如果你觉得博主的文章的不错或者对你有帮助,可以点一个免费的关注支持一下博主,你的鼓励将是我创作的最大动力!! 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐