zoukankan      html  css  js  c++  java
  • Java学习笔记-反射机制

    Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法

    获取Class对象的三种方式

    • Object类中的getClass()方法
      想要用这种方式,必须要明确具体的类,并创建对象
    Person p = new Person();
    Class clazz = p.getClass();
    
    • 任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
      相对简单,但是还是要明确用到类中的静态成员
    Class clazz = Person.class;
    
    • 通过给定的类的字符串名称就获取该类,该方法就是forName
    String className = "com.abc.Person"; //此处为class的全称
    Class clazz = Class.forName(className);
    

    获取构造函数

    • 无参构造函数
    String name = "com.abc.Person";
    Class clazz = Class.forName(name);
    Object obj  = clazz.newInstance();
    
    • 有参构造函数
      获取到该构造函数:getConstructor(paramterTypes);
    String name = "com.abc.Person";
    Class clazz = Class.forName(name);
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    Object obj = constructor.newInstance("test", 10);
    

    获取字段

    公有

    Class clazz = Class.forName("com.abc.Person");
    Field field = clazz.getField("age"); //只能获取公有的
    Object o = field.get(obj);
    System.out.println(o);
    

    私有

    Class clazz = Class.forName("com.abc.Person");
    Field field = clazz.getDeclaredField("age"); //只获取本类,但包含私有
    //对私有字段的访问取消权限检查,暴力访问
    field.setAccessible(true);
    Object obj = clazz.newInstance();
    field.set(obj, 20);
    Object o = field.get(obj);
    System.out.println(o);
    

    获取方法

    • 获取所有方法
    Class clazz = Class.forName("com.abc.Person");
    Method[] methods  = clazz.getMethods(); //获取的都是公有的方法。 
    //methods = clazz.getDeclaredMethods(); //只获取本类中所有方法,包含私有 
    for(Method method : methods){
    	System.out.println(method);
    }
    
    • 调用无参方法
    Class clazz = Class.forName("com.abc.Person");
    Method method = clazz.getMethod("show", null); //获取空参数一般方法。
    //Object obj = clazz.newInstance();
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    Object obj = constructor.newInstance("name", 10);
    method.invoke(obj, null);
    
    • 调用有参方法
    Class clazz = Class.forName("com.abc.Person");
    Method method = clazz.getMethod("show", String.class, int.class);
    Object obj = clazz.newInstance();
    method.invoke(obj, "name", 20);
    
  • 相关阅读:
    Java 代码中如何调用 第三方Api
    如何编写README.md
    Gof 设计模式
    系统架构师-笔记
    我的账户
    软件设计师-成绩查询
    spring data jpa
    日志 logback
    spring boot 整合 Camunda
    Spring 中 bean 的生命周期?
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664828.html
Copyright © 2011-2022 走看看