Java 反射技术

一:
反射技术:动态的获取指定的类以及动态的调用类中的内容
动态:类不确定
其实就是,在你还没有创建这个类的时候就用这个类创建对象,使用方法,这能大大的提高程序的扩展性。
应用场景:在一个完全写好的程序中你要再扩展功能,用之前的知识,肯定是,源程序留一个接口,在外部创建一个类实现接口,并且,在程序中创建实现类的对象调用方法,BUT, 你没有源代码,也就是说你无法在源代码中操作,此时就要用到反射,在程序的配置文件中,写好类的名字,在程序中创建类的对象(这是在写程序的时候干的)。这就是在类不确定(甚至不知有木有的情况下)使用类来创建对象。
//
二:
.class 文件是Java的运行文件,来自于源文件的编译
.class(类文件)中包含了,类的成员变量和方法
字节码文件对应的类:在Java 中有专门描述字节码文件的类Class(描述类文件的类)

class Class{//字节码文件对应的类
		Filed  filed ;//字段(类中的成员变量)将字段封装成对象(修饰/名字/值)对象类型Filed
		Constructor cons;//将构造函数也封装成对象(名字,参数列表。。)对象类型 Constructor
		Method method;   
		将类中的这些成员都封装成对象,变成Class 类的成员。并且提供了对这些成员的操作
		getFiled();
		getMethod();
		getConstructor();
		//...
}

三:
电脑中 .class 文件(存储的是编译后的相应类的二进制文件)————>Java 中描述.class 二进制文件的类 Class(字节码文件的类)————>Java 中对象的创建依赖的就是.class 二进制文件

如何获取字节码文件的类:程序中的对象是依赖于.class 文件创建的,所以通过对象来获取
1.getClass(); //获取字节码文件的类,但是前提是:有类对应的对象

Person person = new Person();
Class class = person.getClass();

2.使用数据类型的静态属性。class

Class class = Person.class;

3.方式三:通过Class 这个类中提供的方法 forName (通过给定的类名,得到字节码文件对象),自动找对应的字节码文件,加载到内存中

Class p = Class.forName("Reflect.Person");//类的名字要写的完全,包名+类名
        //通过newInstance 方法创建字节码文件对应表示的类的实例
        Object obj = p.newInstance();//不依赖于类,去创建类的实例。但是在这个程序写好后必须要有类,不然运行时会出错
        //这就是反射技术获取类的字节码文件对象的方式

四:常见异常解析:
ClassNotFoundException:找不到类对应的字节码文件
InstantiationException :初始化异常,如果类没有提供空参构造函数,就会出现异常
IllegalAccessException:类提供了空参构造函数,但是权限不够也会报错

五:如何根据指定的带参构造函数创建对象

 Constructor con = p.getConstructor(String.class,int.class);
        Object ob = con.newInstance("Lisi",12);//通过构造器来创建对象

六:获取字节码文件对象中的成员
关于获取字节码文件对象的成员:
getXXXX():获取的是共有的getDeclaredXXX():获取的是声明了的

1.获取字段:字节码文件对象.getField() //getDeclaredField()
对于私有的成员变量,是无法对他进行操作的,暴力访问:
field.setAccessible(true);修改权限
修改值: field.set(obj,30);
获取值:field.get(obj)
//
2.获取方法

 Method method = p.getMethod("show",int.class,String.class);
 method.invoke(obj,12,"Wangwu");

七:反射的应用:
反射的使用精华在于,在还没有写类的时候你可以使用类。然后你在封装好的程序外面,在定义类,写好相应的方法。可以完美的解决程序扩充功能这个需求
反射技术的亮点就是为已经写好的程序扩充功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值