反射

java 反射机制提供的功能
1)在运行时判断任意一个对象所属的类
2)在运行时构造任意一个类的对象,判断任意一个类具有的成员变量和方法—获取泛型信息----调用任意一个对象的成员变量和方法—处理注解—生成动态代理–都是在运行时完成的
3)java.lang.Class:代表一个类,通用的描述其他类的结构
4)java.lang.reflect.Method:代表类的方法
5)java.lang.reflect.Field:代表类的成员变量
6)java.lang.reflect.Constructor:代表类的构造器
8)通过反射可以调用类的私有结构,比如:私有的构造方法,私有的方法,私有的属性
9)在获取或设置私有变量或者方法之前,要启动暴力反射,就是调用一个方法setAccessible(true),这个方法,method和field都有
疑问://
1)通过直接new的方式或反射的方式都可以调用公共的解构,开发中到底用哪个.
1.1)直接new的方式.
2)时候时候回使用:反射方式,反射特征:动态性(编译的时候确定不下来new哪个对象 ,列如:聊天室,我们的服务端跑起来的时候,并不知道客户端要干什么,这时候客户端发送一个请求想登陆,那么我们就可以通过这个请求创建一个登陆的对象)(理解动态)
3)反射机制与面向对象中的封装性是不是矛盾的?如何看待两个技术?
3.1)不矛盾.封装是解决的是建议你怎么调用的问题,反射是解决能不能调的问题
4)关于java.lang.Class类的理解
4.1)类的加载过程: 程序在经过javac.exe命令以后,会生成一个或多个字节码文件(.class结尾).接着我们使用java.exe命令对某个字节码文件进行解释运行.相当于将某个字节码文件通过类加载器(classloader)加载到内存中,此过程就称为类的加载. 加载到内存中的类,我们就称为运行时的类,此运行时类,就作为Class的一个实例,(类本身就是一个对象)------换句话说,Class的实例就对应着一个运行时类.
5)加载到内存中的运行时类,会缓存一定的时间,在此时间之内,我们可以通过不同的方式来获取此运行时类
通过反射获取运行时类的方式
1)方式一,调用运行时的属性.class—类名点class返回一个Class通常用来传递参数用
2)方式二,通过运行时类的对象 ,对象点getClass返回一个Class通常用来在运行时获取对象的类对象,equals就是那样的
3)方式三,通过Class的静态方法forName(包名点类名)返回一个Class,通常框架用的多,用来创建对象,比如Sring容器
4)方式四,类的加载器–当前类名点class点getClassLoader()返回一个ClassLoader,然后通过返回的classLoader点loaderClass(“包名类名”)返回一个Class.(了解就好)
4)----------它们获取到的Class对象都是同一个,因为一个类只有一个Class对象
哪些类型可以有Class对象?
1)calss:外部类.成员(成员内部类,静态内部类),局部内部类,匿名内部类.
2)interface:接口 --[]数组 enum:枚举—annotation:注解@interfacee
3)primitive-type:基本数据类型 --void
反射创建对象
1)newInstance() 要想此方法正常的创建运行时类的对象,要求:(1) 运行时类必须提供空参的构造器(2)空参构造器的访问权限的够,通常为public.
2)在javabean中要求提供一个public的空参构造器,原因:
2.1)便于通过反射,创建运行时类的对象
2.2)便于子类继承此运行时类时,默认调用super()时,保证父类有此构造器.
2.3)通常我们都使用空参的构造器创建对象,因为这样统一性都是空参,即便我创建哪个类的对象都一样
通过反射获取对象的信息
1)getFields():获取当前运行时类及父类中声明为public访问权限的属性返回一个Filed数组.
2)getDeclaredFields()获取当前运行时类中声明的所有属性,(不包含父类中声明的属性) (Declare :声明).
3)可以获取属性对应的 访问权限修饰符 类型,以及变量名.

4)getMethods() 获取当前运行时类及其所有父类中声明public权限修饰的方法.
4.1)getDeclaredMethod()获取当前运行时类中声明的所有方法(不包含父类中声明的方法)
4.2)方法的权限修饰符 , 返回值类型 ,方法名(参数类型1,形参名1 …)throws xxxException,还有方法的注解,包括获取构造器的结构,泛型以及父类的泛型,和运行时的父类—运行时类的接口,运行时类所在的包—运行时类声明的注解这些都是建立在获取Class的实例来获取的.

反射调用方法以及设置属性
1)修改运行时类的属性 步骤----1创建运行时类的对象
2获取运行时类中指定变量名的属性getDeclaredField(name) (3)保证当前属性是可访问的setAccessible(true) set(改的那个对象," name");修改值.
2)调用运行时类的方法–步骤1获取那个类的Class实例
(2)获取指定的某个方法 getDeclaredMethod(name,参数类型点class)返回一个Method 对象, —保证当前方法是可访问的 setAccessible()然后调用invoke(“调用者”,“参数”)
3)调用静态类和静态方法 就是在调用普通方法需要传入对象的时候,传入类名点class
Authors
John
Luke
在这里插入图片描述
properties 读取配置文件
方式一:创建一个FileInputStream(指向你想读取的那个文件) 创建一个properties的对象,通过对象调用load(传入fis流)方法,然后通过properties对象调用getProperty(“name”)获取对应的键值对.
方式二:获取calssLoader对象,然后通过classloader对象调用getResourceAstream(f=FilePath) 返回一个InputStream,然后通过创建的Properties对象调用load(in) 以下步骤和上面一样
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值