反射

Java反射机制
  • 动态的获取任意属性和方法的一种方式

  • 获取反射对象有3中方式:

       1、类名.class
       Class<?> clazz = User.class;
       2、对象.getClass();
       User user = new User();
       Class<?> clazz2 = user.getClass();
       3、Class.forName(完整类名);
       Class<?> clazz3 = Class.forName("com.hym.test.User")
    

    结论:无论哪种方式获取的反射对象,都是同一个反射对象
    syso(clazzclazz2); //true
    syso(clazz2
    clazz3); //true

  • 回忆,在数据库中加载驱动,我们就是使用第三种’ Class.forName(" com.mysql.jdbc.Driver ") ';目的是为了初始化数据库Driver类中的static{}

  • 通过反射对象去设置和获取属性

    • 1、获取反射对象
    • 2、通过反射对象拿到Field对象
      Field field = clazz.getDeclaredField(“name”);
    • 3、通过Field对象去设置和获取属性
      如果是私有属性的设置访问权限
      field.setAccessible(true)---默认为false访问不了私有属性
      Object obj = clazz.newInsatnce();
      //设置属性
      field.set(obj,values);
      field.get(obj);  //得到实体类中的属性值
      
      //获取Field数组(字段)
      //getFields(),执行效率高,只能设置和获取非私有的属性
      //getDeclaredFields(): 可以设置和获取私有的属性
      
  • 通过反射对象去获取和使用方法
    1、获取反射对象
    2、通过反射对象拿到Method对象—方法名,参数类型
    3、通过Method对象调用方法———invoke

    Class<?> clazz = User.class;
    
    //type是反射对象的形式
    Method method = clazz.getDeclaredMethod("方法名",String.class,int.class);
    mehthod.setAccessible(true);
    Object obj = clazz.newINstance();
    method.invoke(obj,"hmm",2);
    
  • 通过反射机制调构造方法:
    1、获取反射对象
    2、通过反射对象获取构造器对象。Constructor
    3、通过构造器调构造方法 newInstance

    Class<?> clazz = Student.class;
    //clazz.newInstance();  调用无参构造方法且非私有;
    
    Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
    //设置权限
    constructor.setAccessible(true);
    constructor.newInstance("hym");
    


* 应用场景:
* 案例:通过反射机制灵活获取用户或学生的对象
    类比直接面向对象 静态工厂模式;
    ```
    User u = Tool.getReflect(User.class);
    Student st = Tool.getReflect(Student.class);
    //---------->
    Tool.getReflect(*.class):
    public static <T> T getReflect(Class<T> clazz){
        return clazz.newInstance;
    }
    ```
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值