java反射的代价_java 反射

动态语言?

什么是动态语言,就是在执行的时候可以改变语言自身结构的语言。

例如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获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值