反射举例

反射是框架的前提

1.配置文件 pro.properties

className = anli.Person
methodName = eat

2.Person类

package anli;

public class Person {
    String name;
    int age;


    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }



    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void eat(){
        System.out.println("eat food!");
    }
    public void eat(String food){
        System.out.println("eat food!" + food);
    }
}

3.反射

package anli;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 框架类
 */
public class ReflectTest {
    public static void main(String[] args) throws Exception {

        //下面说说传统的做法  1.先创建对象-->实例化 2.调用方法
        /**
         * 下面这种方法有一个弊端,框架应该是一个半成品的软件。前提是,不能改变框架里面的任何代码,也可以创建任意类
         * 的对象,可以执行任意方法。
         */
        Person p = new Person();
        p.eat();

        //可以创建任意类的对象,可以执行任意方法
        //1.加载配置文件
        //1.1创建properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,把他转换成一个集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        System.out.println(classLoader);//jdk.internal.loader.ClassLoaders$AppClassLoader@512ddf17
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        System.out.println(is);//java.io.BufferedInputStream@511baa65
        pro.load(is);

        //2.获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");

        //3.加载该类进内存
        Class cls = Class.forName(className);

        //4.创建对象 调用无参构造
        Object obj = cls.newInstance();

        //5.获取方法对象
        Method method = cls.getMethod(methodName);

        //6.执行方法
        method.invoke(obj);//eat food!

    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 随着工作年限的增加,日常工作中的需求已不再是findViewById那么简单了,更多的倾向于框架化,源码化的方向发...
    坑逼的严阅读 1,061评论 0 4
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,458评论 0 4
  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,856评论 0 4
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,172评论 1 32
  • “孩子,你不结婚也没关系” -01 在电影《剩者为王》里女主角的父亲有这样一段话: 她不应该为父母亲结婚,她不应该...
    惠子酱酱阅读 186评论 0 0