动态语言?
什么是动态语言,就是在执行的时候可以改变语言自身结构的语言。
例如JavaScript
var a='x=2;y=3,console.log(x+y)';
eavl(a);//控制台打印出5
静态语言?
与动态语言相比,运行时结构不可变的语言就是静态语言。
怎么可以把java从静态语言变成“准动态语言”,这时候就用到了反射。
Java Reflection(反射)机制
java反射机制是让java从静态语言变为准静态语言的关键,反射允许程序在运行期间运用反射的API获得内部类的所有信息(包括私有的属性和方法),并且操纵类的内部属性和方法、注解。
JVM加载完类之后,在堆内存的方法区产生了一个class类型的对象(一个类只能有一个class对象),这个对象中包含完整的类的结构信息。通过Object类中的getClass()方法获得这个类的结构信息,这就是反射。
Java反射优缺点
优点:让java语言在运行的时候有了更大的灵活性。
缺点:灵活性的代价是牺牲性能来获取的。
JRE为每个Class对象保留了一个不变的Class类型的对象。Class本身也是一个类
一个加载的类在JVM中也只能有一个Class实例
一个class对象对应一个JVM中的一个class文件
一个类被加载后,类的整个结构都会被封装在class对象中
每个实例都会记得有哪个class创建
class对象只能有系统建立对象
要想改变类的内部结构,必须先用反射获得类的内部结构
获取class实例的常见三种方法:如果已经知道了具体的类,通过类的class属性获取,该方法安全高效
Class a1=Animal.class;如果已经知道了一个类的实例,使用Object中的getClass 方法获取改class方法
Class a2=animal.getClass();如果知道一个类的包路径名,通过class类的静态方法forName()获取
Class a1 = Class.forName("com.chen.template.Animal");
实例
package com.chen.template;/*
* @author chenxinhui
* @description
* */
import com.chen.pojo.Animal;
public class Reflect {
public static void main(String[] args) throws ClassNotFoundException {
//方式1
Class a1 = Ainmal.class;
//方式2
Ainmal ainmal=new Ainmal();
Class a2= ainmal.getClass();
//方式3
Class a3 = Class.forName("com.chen.template.Ainmal");
System.out.println(a3.hashCode());
System.out.println(a1.hashCode());
System.out.println(a2.hashCode());
}
}
class Ainmal{
private String sex;
private String age;
private String addr;
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
public Ainmal() {
}
public Ainmal(String sex, String age, String addr) {
this.sex = sex;
this.age = age;
this.addr = addr;
}
@Override
public String toString() {
return "Ainmal{" +
"sex='" + sex + '\'' +
", age='" + age + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
另外内置类也可通过TYPE获取