7.javaSE基础_进阶:反射机制(Method,Filed,Constructor,Properties)

一.反射

1.定义

程序可以访问、检测和修改它本身状态或行为的一种能力。

Java的反射机制是在编译时,并不确定哪个类被加载,而是在运行时才加载,这样的特点就是反射

2.功能

在运行时获取一个对象的类信息:访问修饰符、成员、方法、构造及超类的信息。

  • 动态生成对象:反射机制可以在运行时生成对象,这样就可以根据参数的不同,动态的创建不同的类的实例对象。
  • 动态调用方法:通过反射机制可以调用类中的方法,不论这些方法是否是公共的,也不论这些方法的参数个数和类型是什么,反射机制都具有这样的能力。
  • 动态修改属性:利用反射机制可以获取到类中的所有成员变量,并可以对其进行修改

3.应用

  • 开发框架

    IDEA编译时,我们输入一个对象等元素时按.会自动罗列它的属性和方法

  • 框架(Spring,Mybatis,Hibernate)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象

4.常用类和API

使用java.lang.Class类,反设制的起源;

当一个类被加载后,Java虚拟机就会自动产生一个Class对象,通过该对象就能获得该对象的方法、成员及构造等信息;

生成java文件会自动生成相应的class文件

实现反射的类,于java.lang.reflect包中:

含义
Method代表类的方法
Constructor代表类的构造方法
Field代表类的成员变量

5.Class类

  • 方法:

    方法名备注
    public String getName()返回完整类名带包名
    public String getSimpleName()返回类名
    public Field[] getFields()返回类中public修饰的属性
    public Field[] getDeclaredFields()返回类中所有的属性
    public Field getDeclaredField(String name)根据属性名name获取指定的属性
    public native int getModifiers()获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Method[] getDeclaredMethods()返回类中所有的实例方法
    public Method getDeclaredMethod(String name, Class<?>… parameterTypes)根据方法名name和方法形参获取指定方法
    public Constructor<?>[] getDeclaredConstructors()返回类中所有的构造方法
    public Constructor getDeclaredConstructor(Class<?>… parameterTypes)根据方法形参获取指定的构造方法
    public native Class<? super T> getSuperclass()返回调用类的父类
    public Class<?>[] getInterfaces()返回调用类实现的接口集合
    public T newInstance()创建对象
  • newInstance()

    通过反射实例化对象

       Class<Opertor> aClass = Opertor.class;
        Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象
        Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法
        Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法
        System.out.println(invoke);

5.Class实例方式

  1. 方式1
Class<?> aClass = Class.forName("java.util.ArrayList");
Method[] methods = aClass.getMethods();
for (Method method : methods) {
    System.out.println(method);
}
Class<?>[] interfaces = aClass.getInterfaces();
for (Class<?> anInterface : interfaces) {
    System.out.println(anInterface);
}
  1. 方式2:

     Class<Opertor> aClass = Opertor.class;//Optertor类名
      Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象
            Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法
            Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法
            System.out.println(invoke);
    
  2. 方式3:

    //getClass()方法
    Class<? extends Student> aClass = student.getClass();
    

二.相关类及API

1.Method类

  • 方法:

    方法名备注
    public String getName()返回方法名
    public int getModifiers()获取方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?> getReturnType()以Class类型,返回方法类型【一般配合Class类的getSimpleName()方法使用】
    public Class<?>[] getParameterTypes()返回方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】
    public Object invoke(Object obj, Object… args)调用方法
//获取类中所有自定义方法
        Class<Opertor> aClass = Opertor.class;
        Opertor opertor = (Opertor) aClass.newInstance();//通过反射机制动态生成一个对象
        Method method = aClass.getDeclaredMethod("sub", int.class, int.class);//获取自定义的方法
        Object invoke = method.invoke(opertor, 2, 1);//调用Method的内部方法
        System.out.println(invoke);
1)invoke方法

invoke方法:对带有指定参数的指定对象调用由此 Method 对象表示的基础方法方法.invoke(对象, 实参);

2.Field类

  • 常用方法

    方法名备注
    public String getName()返回属性名
    public int getModifiers()获取属性的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?> getType()以Class类型,返回属性类型【一般配合Class类的getSimpleName()方法使用】
    public void set(Object obj, Object value)设置属性值
    public Object get(Object obj)读取属性值
    public void setAccessible(true)允许访问私有属性
    getDeclaredFields()迭代所有属性
1)给属性赋值

属性.set(对象, 值);

属性.get(对象);

注意这里使用的是getDeclaredFields

3.Constructor类

  • 常用方法:

    方法名备注
    public String getName()返回构造方法名
    public int getModifiers()获取构造方法的修饰符列表,返回的修饰符是一个数字,每个数字是修饰符的代号【一般配合Modifier类的toString(int x)方法使用】
    public Class<?>[] getParameterTypes()返回构造方法的修饰符列表(一个方法的参数可能会有多个。)【结果集一般配合Class类的getSimpleName()方法使用】
    public T newInstance(Object … initargs)创建对象【参数为创建对象的数据】

三.Proterties

1.定义

Properties 类表示了一个持久的属性集,是一个Map体系集合类,因为其继承于Hashtable,而Hashtable继承于Dictionary类,实现了Map接口,所以Properties也保留了其相关特性。

2.Properties特点:

  • Properties是Hashtable<Object,Object>的子类;
  • Properties类表示了一个可持久的属性集;
  • Properties可以保存在流中或从流中加载;
  • Properties中每个键和对应的值都是一个字符串(String类型);
  • Properties有一个特殊的作用:专门用来加载xxx.properties配置文件。

3.properties配置文件作用

properties配置主要的作用是通过修改配置文件可以方便地修改代码中的参数,实现不用改class文件即可灵活变更参数。

在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释

java运行中java文件会变成class文件,之后无法通过反编译找到原样的代码,这样的话,如果java类中某个参数变更,就很难灵活的实现参数修改,这个时候properties 文件就能很灵活的实现配置,减少代码的维护成本和提高开发效率

4.常用方法

方法说明
getProperty ( String key)用指定的键在此属性列表中搜索属性。也就是通过参数 key ,得到 key 所对应的 value
load ( InputStream is)从输入流中读取属性列表(键和元素对)。通过对指定的文件进行装载来获取该文件中的所有键 - 值对。以供 getProperty ( String key) 来搜索
setProperty ( String key, String value)调用 Hashtable 的方法 put 。他通过调用基类的put方法来设置 键 - 值对
store ( OutputStream out, String comments)以适合使用 load 方法加载到 Properties 表中的格式,将此 Properties 表中的属性列表(键和元素对)写入输出流。与 load 方法相反,该方法将键 - 值对写入到指定的文件中去
clear ()清除所有装载的 键 - 值对。该方法在基类中提供

5.Java读取Properties文件

Java读取Properties文件的方法有很多,常见有以下几种方式:

使用方式文件位置
new BufferedInputStream(new FileInputStream("source.properties"))项目根目录
Class.getClassLoader().getResourceAsStream("source.properties")src下(ClassPath根)
Class.getResourceAsStream(String path)
 Properties properties = new Properties();
        InputStream inputStream = Demo08.class.getClassLoader().getResourceAsStream("config.properties");
        properties.load(inputStream);
        String property = properties.getProperty("name");
        String property1 = properties.getProperty("age");
        System.out.println("name="+property+"\n"+"age="+property1);

ties.load(inputStream);
String property = properties.getProperty(“name”);
String property1 = properties.getProperty(“age”);
System.out.println(“name=”+property+“\n”+“age=”+property1);


  • 29
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值