三土土三

导航

反射

反射

1.定义:

将类的各个组成部分封装为其他对象

类被编译之后的字节码文件加载进内存之后抽象为成员变量,构造方法,成员方法

(将类的各个组成部分封装为其他对象)

2.优点:

1.可以在程序运行过程中,操作这些对象

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

3.获取Class类对象的方式

1.Class.forName(“全类名”),将字节码文件加载进内存,多用于配置文件;

2.类名.class:通过类名的calss属性,多用于参数传递;

3.对象.getClass():在Object对象中定义;用于对象的获取字节码的方式;

【同一个字节码文件,在一次程序运行过程中,只会被加载一次,不论通过哪种方式获取得Class对象都是同一个】

4.Class对象功能:

·获取功能:

获取成员变量

获取构造方法

构造器用来创建对象,也可以直接用Class对象.newInsance(只能使用空参构造方法)

构造器.newInstance();(含参构造)

获取成员方法

获取类名

5.反射案例演示

例:我们写一个”框架“,即一个不通过改动代码而能实现传递不同参数的要求的特殊类,能实现指定类的方法。

我们需要编写一个类,能帮我们实现为某一个指定的类创建对象,并且执行这个类中指定的方法,不是通过传统的方法去实现,因为我们会注入不同的类,而且这个类一旦编写成功,就不会再去改里面的代码,是通过改配置文件来实现不同的功能。

创建Person类和Student类,并分别含有方法study()和eat()

public class Person {
   private String name;
   public void study(){
       System.out.println("学习使我快乐");
  }
}
public class Student {
   private String name;
   public void eat(){
       System.out.println("干饭人,干饭魂");
  }
}

编写配置文件;pro.properties,【后缀名必须为properties】

className=com.yf.pojo.Person
methodName=study

编写这个特殊的类

public class Demo02 {
   public static void main(String[] args) throws Exception {
       //1.加载配置文件
       //1.1
       Properties properties = new Properties();
       ClassLoader classLoader = Demo02.class.getClassLoader();
       InputStream rs = classLoader.getResourceAsStream("pro.properties");
       properties.load(rs);
       //从配置文件中获取信息
       String cl = properties.getProperty("className");
       String md = properties.getProperty("methodName");
       //System.out.println(cl+"=="+md);
       //获取Class对象
       Class acl = Class.forName(cl);
       //创建对象
       Object obj= acl.newInstance();
       //获取方法
       Method method = acl.getMethod(md);
       //执行方法
       method.invoke(obj);
  }
}

 

posted on 2021-03-30 19:27  弓长三土  阅读(32)  评论(0编辑  收藏  举报