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功能

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="老师";
}
}
输出结果:

4、各种类型的class
有很多类型都有自己的class:

假如两个内容不一样的数组,其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: 此篇博文内容参考于遇见狂神说。供读者阅读参考,感谢~!

浙公网安备 33010602011771号