18 反射

18反射

底层技术 通常用来实现框架和工具

运行时类型判定

类对象 Class类的对象

类加载:当JVM第一次使用一个类的时候,它需要将这个类对应的字节码文件读入JVM,从而获取这个类的全部信息(类的父类,有哪些属性,方法,构造方法等等),并保存起来。(保存在JVM的方法区)

类对象:类加载的产物,包含了一个类的全部信息

Dog类

  • 类的对象:该类的对象 大黄 Dog类

  • 类对象: 纪录类信息的对象 记录Dog信息的对象 Class类

获得类对象的三种方法

  1. 类名.Class 直接获得类对象 也可以获取8种基本类型的类对象

  2. 类的对象.getClass() 获得类对象

  3. Class.forName("类的全名") 通过类名字符串,获得类对象。可能会先加载该类

Class c1 = ArrayList.class;
        
        List l = new ArrayList();
        Class c2 = l.getClass();
        System.out.println(c1 == c2);
​
        String classname = "java.util.ArrayList";
        Class c3 = Class.forName(classname);
        System.out.println(c2==c3);

Class对象的方法

  • getName() 获得类名

  • getSuperclass() 获得父类的类对象

  • getInterface() 获得所有接口的类对象

  • getMethods() 获得类中所有公开方法的Method对象,java.lang.reflect.Method:保存了一个方法的信息

  • getDecalredMethods() 获得本类中所有方法的Method对象

  • getMethod()/getDeclaredMethod() 根据方法名和参数表,获得类中的某个方法 返回值Method对象

类对象.newInstance() 通过类对象,创建类的对象

 //Student s = new Student();
   Scanner sc = new Scanner(System.in);
   String classname = sc.next();
   Class c = Class.forName(classname);
   Object o = c.newInstance();

Method对象.invoke() 通过Method方法,调用该方法

//  s.study();
    String methodname =sc.next();
    Method m =c.getMethod(methodname)
    m.invoke(o);

调用对象的私有方法

String methodname ="study";
   Method m =c.getDeclaredMethod(methodname);
   m.setAccessible(true);//设置方法可访问性为真
   m.invoke(o);

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值