反射举例

2019-04-28  本文已影响0人  UlissesJr

反射是框架的前提

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!

    }
}
上一篇下一篇

猜你喜欢

热点阅读