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)通过反序列化的方式创建对象

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-今非昔比°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值