Java 反射1

> Java 反射1

1、静态语言 & 动态语言

1.1、动态语言

  • 动态语言:在运行时可以改变结构的语言
  • 主要动图语言:C#、JavaScript、PHP、Python

1.2、静态语言

  • 静态语言:在运行时不可以改变结构的语言 如:Java、C、C++
  • Java为"准动态语言"。有一定的动态性,可以利用反射机制获得类似动态语言的特性,让编程更加灵活。

2、什么是反射

2.1、Reflection含义

  • 反射机制可以让程序在执行期借助Reflection API取得任何类的内部信息,并能直接操作任意对象内部属性方法
  • 加载完类后,在堆内存的方法区中有一个Class对象,包含完整的类的结构信息,可以通过这个对象(类似镜子)看到类的结构,形象称为:反射

正常方式:引入包名--->new实例化--->取得实例化对象

反射方式:实例化对象--->getClass()方法--->获得完整的"包"名

2.2、Reflection功能

image-20210925201853950

2.3、Reflection优缺点

  • 优点:实现动态创建对象和编译,灵活。
  • 缺点:性能较慢

3、获得class几种方式

package com.li.reflection;

public class test01 {

   public static void main(String[] args) throws ClassNotFoundException {
       Person person1 =new student();
       Person person2 =new teacher();

       System.out.println("这个人是:"+person1.name);
       System.out.println("这个人是:"+person2.name);


       //方式一  对象获得
       Class c1 = person1.getClass();
       System.out.println(c1.hashCode());

       //方式二  forname获得
       Class c2 = Class.forName("com.li.reflection.student");
       System.out.println(c2.hashCode());

       //方式三  类名.class获得
       Class c3 = student.class;
       System.out.println(c3.hashCode());

       //方式四  内置类型的包装类的Type属性
       Class c4 = Integer.TYPE;
       System.out.println(c4);

       // 获取父类类型
       //这里c1是student类 父类是Person 可以得到Person类名
       Class c5 = c1.getSuperclass();
       System.out.println(c5);
   }
}

class Person{
   String name;

   public Person() {
   }

   public Person(String name) {
       this.name = name;
   }


   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               '}';
   }
}

class student extends Person{

   public student(){
       this.name="学生";
   }
}

class teacher extends Person{

   public teacher(){
       this.name="老师";
   }
}

输出结果:

image-20210926135517582


4、各种类型的class

有很多类型都有自己的class:

image-20210926140346793

假如两个内容不一样的数组,其class的哈希值一致(只要类型相同就相同)

int[] a=new int[1];
        int[] b=new int[10000000];
        System.out.println(a.getClass().hashCode());
        System.out.println(b.getClass().hashCode());
输出结果:
    1163157884
	1163157884   

Ps: 此篇博文内容参考于遇见狂神说。供读者阅读参考,感谢~!

posted @ 2021-09-26 14:44  江之南  阅读(121)  评论(0)    收藏  举报