zoukankan      html  css  js  c++  java
  • Java反射机制总结

    首先咱们要知道什么是类对象:类对象就是记录某个类本身的构造方法、属性、方法的对象。

    1. 获取类对象的三种方式

    Class.forName('完整类名')
    类名.class
    new 类名().getClass()

    示例:用反射来创建一个新的对象。

    package reflection;
    import java.lang.reflect.Constructor;
    import dealreflect.Hero;
    public class TestReflection {
      
        public static void main(String[] args) {
              
            try {
                //使用反射的方式创建对象
                String className = "dealreflect.Hero";
                //类对象
                Class pClass=Class.forName(className);
                //构造器
                Constructor c= pClass.getConstructor();
                //通过构造器实例化
                Hero h2= (Hero) c.newInstance();
                h2.name="gareen";
                System.out.println(h2);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    2. 反射类里面的方法

    1.加载类 Class clazz = Class.forname("完整类名")

    2.加载方法 Method method = clazz.getMethod("方法名",String.class,int.class(参数类型))

    3.运行方法  method.invoke(类的实例,传参)

     注意这儿得传类的实例,类对象是不行的。

    反射main()方法

    1.加载类 Class clazz = Class.forname("完整类名")

    2.加载方法 Method method = clazz.getMethod("main",String[] args);

    3.运行方法,比较奇怪 method.invoke(null,new Object[](new String[]{"aa","bb"})) 或者  method.invoke(null, Object(new String[]{"aa","bb"}))

    因为在往主函数里传String数组的时候,程序会自己拆分成String a1,String a2

    3. 反射类里面的字段

    1.加载类 Class clazz = Class.forname("完整类名")

    [clazz.setAccessible(true)] 进行暴力反射,就可以拿到private属性或方法的值了。

    2.加载字段 Field f = clazz.getField("字段名")  

    备注:getField和getDeclaredField的区别

    这两个方法都是用于获取字段
    getField 只能获取public的,包括从父类继承来的字段。

    getDeclaredField 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (注: 这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))

    3.获得字段的值
    String name = (Stirng) f.get(p)
    或者 Object value = f.get(p)

    4.获取字段的类型
    Class type = f.getType();

    5.设置字段的值
    f.set(p,"xxxxxxxx")

  • 相关阅读:
    【Flutter 实战】1.20版本更新及新增组件
    【Flutter 实战】各种各样形状的组件
    【Flutter 实战】全局点击空白处隐藏键盘
    Flutter —布局系统概述
    【Flutter 实战】17篇动画系列文章带你走进自定义动画
    lvs负载简介,原理,常见使用案例及Keepalived高可用
    02 . MongoDB复制集,分片集,备份与恢复
    Go之Casbin简介,安装,模型,存储,函数
    govendor包管理及Go项目热加载
    教你三招快速文件批量重命名方法
  • 原文地址:https://www.cnblogs.com/NoYone/p/8398527.html
Copyright © 2011-2022 走看看