java基础--反射

反射是一种底层编程,为了解决通用编程。
(写一个方法printMethods,参数是一个字符串className,传一个类的名字,这个方法把一个类有哪些方法打印出来。)
学习反射最关键的一个概念:类对象:类加载的产物,封装了一个类的信息。一个类在JVM中对应一个类对象。类对象所属的类是Class类,Class这个类的对象就是类对象。
在动物园,某种动物不认识,旁边有一个信息牌,那个信息牌描述的是整个一个类的信息,而这个牌子对象就是类对象。而类的对象,就是笼子里跑着的狼。

类加载:当JVM第一次使用一个类的时候,必须通过ClassPath找到这个类对应的class文件,把这个文件中记录的类的信息读入JVM,并保存起来。在JVM里面,加载以后的类也是以对象的形式存储。JVM加载一个类之后,就会把这个类的信息封装到一个对象里。像这样封装了一个类的信息的对象,叫做类对象。类对象实际上是类加载的产物,类对象有了,类加载也就结束了。一个类只要加载了,这个类对象就在JVM空间里就已经存在了。
对象的信息在JVM中会以对象的形式存储。

获取类对象的引用,一共有三种办法:
1. 类名.class
Class c1=ArrayList.class。类名后直接加.class就是这个类的类对象,这是通过类名直接获得类对象。
2. 类的对象.getClass()
ArrayList l=new ArrayList();
Class c2=l.getClass();
通过类的对象获得类对象。getClass()返回一个对象对应的类对象。

3. Class.forName(“包名.类名”);这种方式把类名放在一个字符串里,这样类名就可以是一种变量。如果这个类还没有被加载,就先加载一下,这条语句后,这个类一定加载了。
Class c3=Class.forName(“java.util.ArrayList”);
经常会这样用Class.forName(“java.util.ArrayList”);就是为了让这个类加载一下。
以上三种方法的例子都指向一个 java.util.ArrayList类对象,因为一个类对象只会加载一次。

一个类的属性的信息会统一封装到Field对象中,类的方法的信息会统一封装在Method对象中,类的构造方法会封装在Constructor对象中。Field、Method和Constructor都属于java.lang.reflect包,这个包是反射包。

反射主要掌握方法对象(Method对象):Method封装了方法信息。对于一个Class有两个方法:
1. getMethods():返回父类的和本类的公开方法
2. getDeclaredMethods():返回本类的所有方法

反射是一种底层技术,我们在做java编程的时候要使用一些工具和一些框架,这些东西有人去开发,对于广大程序员主要是使用。如果开发工具有框架,不可避免地要使用反射,反射是用来制作工具的,而我们大部分时间是在使用工具。

反射最强大的地方是在于:利用反射能做到所有不用反射能做到和做不到的东西。
newInstance():通过类对象创建类的对象。通过类去创建对象,也不只是有new一种方法。对类调用这个方法,会调用类的无参构造方法创建一个类的对象。这个类如果没有无参构造方法,这个方法要运行就会抛异常。

方法的参数表,可以用一个类对象的数组表示。
8种简单类型也有对应的类对象。

反射是一种通用编程,但是它牺牲效率,而且使用反射就会使程序变得脆弱,因为它绕开了编译器,如果有错,只能在运行时抛异常。反射可以破坏封装,但封装是一种高层的思想设计,反射是一种底层技术,它跟封装没有关系。封装防的是正常访问的途径,反射是另辟蹊径。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值