反射与直接new的方式的区别:
编译的时候不知道造哪个类的对象,需要用到反射,因为反射具有动态性。比如,服务器不知道用户登录还是注册,因而不知道造谁的对象,所以需要用到反射。
反射与封装性:
反射解决的是能不能调的问题,封装性解决的是应该调谁的问题。
Class类
类的编译过程:
程序接受javac.exe命令后,会新建一个或多个字节码文件,以.class结尾。
类的加载过程:
使用java.exe命令运行字节码文件,首先是加载到内存中去,这就是运行时类。运行时类就是Class的对象,每个Class的实例都对应着一个实例。静态方法、变量也是对象在调。
Class实例有四种获取方式,不同方式获取或赋予不同名称的实例都是同一个对象,也就是说内存地址都相同。
Class的实例揽括Java的所有结构,包括Class自己、接口、枚举类、数组、基本数据类型、void、注解。
ClassLoader类
引导类加载器:加载JDK的核心库
扩展类加载器:负责jre/lib/ext目录下的jar包或–D java.ext.dirs指定目录下的jar包装入工作库,不能被获取。
系统加载器:自定义类的加载器。使用ClassLoader类可以获取这个加载器。
使用ClassLoader可以加载src文件夹下的配置文件。
举例:Reflection\ClassLoaderTest.java
通过反射创建运行时类的对象
通用做法的要求:
·类必须要有空参构造器
·类的空参构造器不能由private修饰,一般用public修饰
*Java 9以后已经抛弃Class的newInstance()方法,改用Constructor的newInstance()方法。
反射在动态代理中的应用
在直接访问对象不太方便时,我们可以此对象的代理对象。
代理类与被代理类共用接口。
静态代理:编译时明确代理某个类。
动态代理:不明确代理哪个类,只在运行时确定。