栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java反射机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java反射机制

Java反射机制

  关于反射,我也是听过很多遍,我也去学习了一段时间,但是一直模模糊糊的,平时像我是做前端的,更没有机会遇见。现在有空闲时间了,就找了很多的文章看了,梳理了下,好歹是弄清楚了点。

介绍:

  我看了很多的介绍,第一句话就是告诉你:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;这句话虽然简单,但是像我这种实践少的,理解起来就特别费劲,没有具体的场景,感觉只能算是对自己猜测的一种认可。
  这里其实有一个很明显的例子:就是你使用编程软件的时候用到的东西,当你输入一个类的时候,你输入.这个符号的时候,他会把这个类的方法给你显示出来。这样来看,“运行状态”中指的就是你的编程软件运行,然后他通过反射手段,把你类的所有属性和方法拿到,在把相应的部分显示给你。(通过getMethods()返回类所有的方法,getFields()返回所有的字段(也就是属性))。
  例子:

项目结构:

properties文件

className=com.myClass.Cat

Cat类:

package com.myClass;

public class Cat {
    public String name = "小猫";
    private int age = 0;
    public void eat(){
        System.out.println("小猫吃鱼...");
    }
    public void play(){
        System.out.println("小猫玩耍...");
    }
    public void sleep(){
        System.out.println("小猫睡觉...");
    }
}

reflection类

package com.myClass.reflection;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Properties;

public class Reflection {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\properties")); // 加载配置文件,就相当于加载文件,然后放到一个配置类中去

        String classFullPath = properties.get("className").toString();// 获取配置类中的信息
        
        // 反射的使用
        Class clazz = Class.forName(classFullPath);

        Field[] fields = clazz.getFields(); //获取所有的属性
        // 打印输出
        System.out.println("属性有:");
        for(Field f : fields){
            System.out.println(f.getName());
        }

        Method[] methods = clazz.getMethods();// 获取所有方法
        // 打印输出
        System.out.println("方法有:");
        for(Method m : methods){
            System.out.println(m.getName());
        }
    }
}

运行截图:

这里多出来的方法继承自基类而来。

两种方式比较:

  我们一般创建对象都是都是在未运行时new className();然后再去调用相应的方法。而反射可以做到在未运行时不去创建对象,而在运行的时候去完成这个对象的创建,再去使用相应的方法。下面比较下两种情况:

  未使用反射:

	Cat cat = new Cat();
	cat.eat();

  使用反射:

	Properties properties = new Properties();
    properties.load(new FileInputStream("src\properties")); // 加载配置文件

	// 获取配置文件信息
    String classFullPath = properties.get("className").toString(); // 获取类名->com.myClass.Cat
    String methodName = properties.get("method").toString(); // 获取调用的方法->eat

	// 下面两步相当于new Cat();
    Class clazz = Class.forName(classFullPath);
    Object obj = clazz.newInstance();
    
    // 下面两步相当于cat.eat();
    Method method = clazz.getMethod(methodName);
    method.invoke(obj);

从上面就可以看见反射的好处,假设我需要改变调用的方法,第一种非反射方式只能改源码,而反射方式能通过修改配置文件就能做到。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1020866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号