反射的案例

#反射:将类的各个组成部分封装为其他对象(反射机制)

##反射的好处:1.可以在程序运行过程中,操作这些对象

                           e.g.当我们定义一个字符串的时候String str = "abc";在编译工具中我们通过str.的时候会调出很多该类的所有方                              法。IDEA工具内部将字符串的字节码文件加载到内存,内存中有一个Class类对象,class类对象将所有方法放                              到Method数组对象中。

                          2.可以解耦,提高程序的可扩展性

##Java代码在计算机中经历的三个阶段(红色为java代码在不同阶段获取class对象的方式

    1.Source源代码阶段

      xxx.java文件通过javac编译为xxx.class文件,该阶段代码是在硬盘存储的。xxx.class文件中含有成员变量、构造方法、成员方法等。在该阶段可以通过Class.forName("全限定类名")的方式将字节码文件加载至内存,该方法多用于框架的配置文件中。

    2.Class类对象阶段

        Class类对象用来描述字节码文件,该部分类加载器classLoader将l类的各个组成封装为其他对象Field[]、Constructor[]、Method[]数组对象。该阶段通过类名.class来获取class对象。

    3.Runtime运行时阶段

        创建对象阶段,及我们经常用的new关键字创建对象,在该阶段通过对象.getClass()方法获取Class对象(该方法是Object里面的方法,所有类都继承Object类)

#获取方式demo(以后再加)

#反射的案例:写一个简单的反射框架,要求在不改变类中任何代码的前提下,可以创建任意类的对象,可以执行类中的任意方法。

该反射框架的魅力在于只需要改变配置文件中的代码,就可以实现不同类中的不同方法。

Person类代码:

package cn.wei.domain;

public class Person {
    private String name;
    private int age;

    public String a;
    protected String b;
    String c;
    private String d;


    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 +
                ", a='" + a + '\'' +
                ", b='" + b + '\'' +
                ", c='" + c + '\'' +
                ", d='" + d + '\'' +
                '}';
    }


    public void eat(){
        System.out.println("eat...");
    }

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

Student类代码:

package cn.wei.domain;

public class Student {


    public void sleep(){
        System.out.println("sleep...");
    }
}

框架类代码:

package cn.wei.reflect;

import cn.wei.domain.Person;
import cn.wei.domain.Student;

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 {
        //可以创建任意类的对象,可以执行任意方法

        /*
            前提:不能改变该类的任何代码。可以创建任意类的对象,可以执行任意方法
         */
      /*  Person p = new Person();
        p.eat();*/
/*
        Student stu = new Student();
        stu.sleep();*/

        //1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,转换为一个集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        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);


    }
}
className=cn.wei.domain.Student
methodName=sleep

pro.Properties配置文件

className=cn.itcast.domain.Student
methodName=sleep

只要改变配置文件的类名和方法名就可以实现不同的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值