java中反射系列一

我们知道java是面向对象,所有的事物都是用面向对象的思想去思考这类事物有什么,比如人,有腿 眼睛,鼻子,这些就是累的属性,还可以跑,打球,这是对象的方法,但是有一种很特殊的类,就是各个java类,比如Person,Dog等,这些可以向上抽取成一个父类,那就是Class,Class类描述了类的的名字,类所属的包名,字段名称的列表,Class其实代表的是这个类在内存中的的字节码,

字节码:当程序运行时,会从硬盘上把类的二进制代码编译成Class放在硬盘中,然后加载到内存当中,然后才可以用这个Class去创建对象,每一个字节码就是一个Class对象

获取类的字节码有三种方式

1:对象.getClass()

2:类.class

3:Class.forName(类的全路径);这个方法是先判断该类的字节码是否在内存中,没有不在就用类加载器把类加载到内存中

如果内存中存在类名的字节码, 则直接返回字节码.
如果虚拟机没有相应类名的字节码,用类加载器去加载, 加载后, 将字节码缓存起来, 同时, forName方法返回刚才加载进来的字节码


一个类的字节码在内存中只有一份,下面通过代码验证:

Person.java

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


PersonTest.java

public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person("SS");

Class cs1 = p1.getClass();
Class cs2 = p2.getClass();
Class cs3 = p3.getClass();

System.out.println(cs1==cs2);
System.out.println(cs1==cs3);
}
}

打印结果:

true
true

这就说明类的字节码在内存中只有一个,但是可以用这个字节码创建很多个对象,


现在看看Class类一些方法


getField(String name)    返回一个Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段

getFields() 返回一个包含某些Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。

getMethods() 返回一个包含某些Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共member 方法


getName()  以String 的形式返回此 Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。

getPackage()获取此类的包

getSimpleName()返回源代码中给出的底层类的简称。

isArray()判定此 Class 对象是否表示一个数组类。
isPrimitive() 判定指定的 Class 对象是否表示一个基本类型。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值