Web开发——反射

Web开发——反射

一、 简介:反射是框架设计的灵魂。将类的各个组成部分封装为其它对象。可以在程序运行中操作这些对象,可以解耦并提高层序可扩展性。

二、 反射机制:java代码在计算机中要三个阶段

  1. 源代码阶段:我们写好“.java”源文件代码后不能立即运行,要通过 javac命令对文件进行编译,编译后在磁盘中生成“.class”字节码文件。此时文件还未进内存,对象还未生成。

  2. Class类对象阶段:通过类加载器ClassLoader将字节码文件加载进内存。用Class对象来描述这些字节码文件中的信息(构造方法、成员变量等)

  3. 运行时阶段:通过new关键字来在内存中构建对象在这里插入图片描述

三、Class

  1. 获取与设置成员变量:主要目的用来获取、设置成员变量的值。

    1. 获取所有变量:
      考虑修饰符:public Field[] getFields()
      不考虑修饰符:public Field[] getDeclaredFields()

    2. 根据名称获取特定变量:
      考虑修饰符:public Field getField()
      不考虑修饰符:public Field getDeclaredField()

    3. 获取到变量对象Filed后可以用来设置、获取某个对象中该变量的值:

      public class Test {
          public static void main(String[] args) throws Exception {
              Class<Person> pCLass = Person.class;
              Person person = new Person();
              Field age = pCLass.getDeclaredField("age");
              age.setAccessible(true);  //暴力反射
              age.set(person,2);         //对private修饰的成员变量需要暴力反射忽略其权限
              System.out.println("person.age:"+age.get(person));
          }
      }
      
  2. 构建对象newInstance():利用Class生成实例对象
    Person类有无参默认构造方法才行

     Class person = Person.class;
     Object p = person.newInstance();
     System.out.println(p);
    
  3. 获取与设置成员方法:主要目的用来调用执行方法。

    public class Test {
        public static void main(String[] args) throws Exception {
            Class personClass = Person.class;
            Person person = new Person();
            Method eat = personClass.getMethod("eat",String.class);//获取特定方法,指明
            eat.invoke(person,"饭..");
        }
    }
    
  4. 加载字节码文件的三种方法:
    - Class.forName(“全类名”)
    - 类名.class
    - 对象.getClass()

  5. 反射的应用

    1. 不改变类的任何代码,可以创建任意类的对象,调用任意方法。
      在配置文件中写好类名与要调用的方法名。
      在这里插入图片描述

      package Day_3_20;
      
      public class Person {
          public void sleep(){
              System.out.println("sleep....");
          }
      }
      
      

      利用反射来生成配置文件中指定的类对象并调用其方法。

      	public class Test {
      	    public static void main(String[] args) throws Exception {
      	        InputStream reader = Test.class.getClassLoader().getResourceAsStream("pro.properties");
      	        Properties pre = new Properties();
      	        pre.load(reader);
      	        String className = pre.getProperty("className");
      	        String methodName = pre.getProperty("methodName");
      	        Class<?> aClass = Class.forName(className);
      	        Object obj = aClass.newInstance();
      	        Method method = aClass.getMethod(methodName);
      	        method.invoke(obj);
      	    }
      	}
      	```
      
      
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值