Java学习—07. 反射

反射

1. 获取Class三种方式

  • Class.forName()
  • 对象.getClass()
  • 类型.class
public static void main(String[] args) {
    /*
     * 1. forName是一个静态方法
     * 2. 参数是一个字符串
     * 3. 参数必须是一个完整类名
     * 4. 此方法会导致类加载,执行且只执行静态代码块中的内容
     */
    Class c1 = Class.forName("java.lang.String");


    /*
    * 所有对象都有一个getClass()方法:可以和获取字节码文件
    */
    String s= "";
    Class c2 = s.getClass();

    
    /*
    * Java中所有的数据类型都有 .class 属性:用来获取字节码文件
    */
    Class c3 = String.class;
    
    
    /*
     * 获取类的名字
     */
    String name = Student.getName();                //获取全类名:com.Ming.Student
    String simpleName = Student.getSimpleName();    //获取类名:Student
}

2. Field类

  1. 获取FIled

    https://www.bilibili.com/video/BV1Rx411876f?p=823&t=7.6

    public static void main(String[] args) throws ClassNotFoundException {
        Class Student = Class.forName("com.Ming.Student");
    
        //获取Field
        Field[] fields = Student.getFields();                       //获取修饰符为public的Field
        Field[] declaredFields = Student.getDeclaredFields();       //获取全部Field
        
        for (Field declaredField : declaredFields) {
            String name = declaredField.getName();          //获取属性名
            Class type = declaredField.getType();           //获取属性类型
            int i = declaredField.getModifiers();           //获取修饰符列表,返回值为int,每个数字对应一组修饰符列表
            String s = Modifier.toString(i);
        } 
    }
    
  2. 访问对象属性

    https://www.bilibili.com/video/BV1Rx411876f?p=825&t=105.7

    public static void main(String[] args){
        Class Student = Class.forName("com.Ming.Student");
        Object student = Student.newInstance();
        
        
        Field fieldName = Student.getDeclaredField("name");		//获取Field
        fieldName.set(student,"Ming");						//设置对象student的 属性fieldName的 值Ming
        fieldName.get(student);								//获取对象student的 属性fieldName的值
    }
    

3. Method类

https://www.bilibili.com/video/BV1Rx411876f?p=828&t=3.0

public static void main(String[] args) throws Exception {
    Class Student = Class.forName("com.Ming.Student");
    Object student = Student.newInstance();

    Method sum = Student.getDeclaredMethod("sum", int.class, int.class);        //根据方法名,形参 获取Method
    Object invoke = sum.invoke(student, 3, 4);                              //方法名.invoke(对象,形参列表)
}

4. Constructor类

https://www.bilibili.com/video/BV1Rx411876f?p=831&t=179.7

5. 获取父类,父接口

https://www.bilibili.com/video/BV1Rx411876f?p=833&t=26.0

6. 资源绑定器

/*
* 资源绑定器
* 1. 只能绑定properties文件,且放在类路径下
* 2. 路径的扩展名不能写
*/
ResourceBundle bundle = ResourceBundle.getBundle("classInfo");
String className = bundle.getString("className");

7. 类加载器

jDK中自带三种类加载器,使用了双亲委派机制

  • 启动类加载器(父)
  • 扩展类加载器(母)
  • 应用类加载器(加载calsspath中的jar包)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值