zoukankan      html  css  js  c++  java
  • 浅谈Java反射机制 之 获取类的字节码文件 Class.forName("全路径名") 、getClass()、class

    先贴上Java反射机制的概念:

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;

    对于任意一个对象,都能够调用它的任意一个方法和属性;

      这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

      这么一讲很强大有没有!

      反射的机制的实现还有仰仗Class类,因为想要剖析一个类就必须先要获取到该类的字节码文件对象,而Class类用于表示.class文件(字节码)

      而且从获取到剖析使用的都是Class类的方法。

    获取类字节码方法有三种:

    1、通过实例化对象的 stu.getClass() 获取到字节码文件

    getClass()方法其实是Object的一个方法,Class继承了Object,所以我们可以直接使用。

    public class Test01 {
        
        public static void main(String[] args) {
            Student stu=new Student();
            Class c=stu.getClass();
            System.out.println(c.getName());
        }
    }

    结果:com.reflection.model.Student

    当然这种方法没什么意义,因为我们都 new 实例化对象了,就没有必要反射了。

    2、通过类的 .class 属性获取类的字节码文件

    import com.reflection.model.Student;
    public class Test02 {
        public static void main(String[] args) {
            Class c= Student.class;
            System.out.println(c.getName());
        }
    }

    结果:com.reflection.model.Student

    这种方法比第一种方法稍好,当也有不足之处,因为需要导入类的包,这样做依赖性太强,不利于解耦。

    3、通过类的全路径名获取Class对象 使用Class.forName("全路径名")来实现

    此处可能会报出 ClassNotFoundException 异常因为 你给的全路径名可能不存在,因此给他加一个try{}cath(){}

    public class Test03 {
        public static void main(String[] args) {
            try {
                Class c=Class.forName("com.reflection.model.Student");
                System.out.println(c.getName());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    结果:com.reflection.model.Student

    比较前两个方法我们可以看出第三种方法才是我们需要的。

    虽然这里用是  全路径名 输出的结果也是 全路径名,但取到的是一个 类的字节码文件,可以用它做很多事。

    下一篇将会讲到  :获取 类 的 方法 和 属性(包括构造函数)

  • 相关阅读:
    oracle增加字段,循环
    mybatis批量插入和更新
    oracle触发器
    Java中<? extends T>和<? super T>的理解
    函数式编程
    mybaitis
    操作word
    服务大厅流程
    jdk动态代理
    操作系统
  • 原文地址:https://www.cnblogs.com/mww-NOTCOPY/p/11218024.html
Copyright © 2011-2022 走看看