[Java-基础]反射__Class对象

动态性

动态语言

  • 在程序运行时,可以改变程序结构或变量类型,典型的语言:
    • Python,ruby,javascript
    • 如:
function test(){
    var s = "var a=3;var b=5;alert(a+b);";
    eval(s);
}

Java的动态性

  • C,C++,JAVA不是动态语言,但是JAVA有一定的动态性
  • 我们可以利用反射机制,字节码操作获得类似动态语言的特性
  • JAVA的动态性让编程的时候更加灵活

Class类

反射机制

  • 指的是可以于运行时加载,探知,使用编译期间完全未知的类
  • 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性。

Class c=Class.forName("com.User");

  • "com.User"是字符串,是类的路径,可以动态的实时的加载这个类。
  • 加载完类之后,在堆内存中,就产生一个Class类型的对象,一个类只有一个Class对象,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象像一面镜子,透过这个镜子看到类的结构。所以称之为反射、

获取Class对象的方式

  • 获取Class对象的三种方式
  • 1 Object ——> getClass();
  • 2 任何数据类型(包括基本数据类型int,数组等)都有一个“静态”的class属性
  • 3 通过Class类的静态方法:forName(String className)(常用)
public class Demo01 {

    public static void main(String []args){
        //第一种  Object ——> getClass();
        User user1 = new User();
        Class clazz1=user1.getClass();
        System.out.println(clazz1.hashCode());

        //第二种 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
        Class clazz2 = User.class;
        System.out.println(clazz2.hashCode());

        //第三种:通过Class类的静态方法:forName(String  className)(常用)
        String path="com.fanshe.User";
        try {
            Class clazz3=Class.forName(path);
            System.out.println(clazz3.hashCode());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

这三种方法得到的hashcode是一样的,这验证了一个类只有一个Class对象:一个工厂可以有很多辆车,但可能只有一张图纸。

参考

[1] https://www.cnblogs.com/nullcodeworld/p/8878747.html

[2] b站:av29578196

猜你喜欢

转载自www.cnblogs.com/smallocean/p/12360677.html