zoukankan      html  css  js  c++  java
  • day07 Class_field_method_反射

    Class
    由于Class类没有公共构造方法,所有创建Class的对象的方法有以下几种:
     
    1).通过Class.forName()静态方法返回Class类的一个实例
    Class cls=Class.forName("model.Dog"); Class cls1=Class.forName("model.Person");
    2).通过类名.class来获取一个class类的实例
    cls =Dog.class;
    3).代码运行在非静态区通过this.getClass()获取Class
    Class cls= this.getClass();
     
    Class对象既然是描述一个类,那么我们通过该Class的实例能够做什么事情呢?
    类的属性
    获取类名
    System.out.println(cls.getName()); System.out.println(cls.getSimpleName());
    获取类的修饰限定符
    int modi = cls.getModifiers(); System.out.println(modi);
     
    --获取一个类的属性
    1.根据一个属性名获取一个public属性的描述
    Field field = cls.getField("name");
    2.获取一个类的全部public属性的描述
    Field[] fields = cls.getFields(); System.out.println(fields.length);
     
    3.根据一个属性名获取一个在类中声明的属性的描述
    Field declaredField = cls.getDeclaredField("gender");
    4.获取所有在类中声明的属性的描述
    Field[] declaredFields = cls.getDeclaredFields(); System.out.println(declaredField);
     
    --获取一个类的方法,通过四个方法获取method对象
    1.根据一个方法的名字获取类中的一个public的方法的描述
    Method method = cls.getMethod("run", String.class,int.class);
    2.获取所有在类中是public的方法的描述
    Method[] methods = cls.getMethods();
     
    3.根据一个方法名获取在类中声明的一个方法的描述
    Method declaredMethod = cls.getDeclaredMethod("eat", null);
    4.获取所有在类中声明的方法的描述
    Method[] declaredMethods = cls.getDeclaredMethods();
     
     
    返回cls所代表的类的实例
    Object obj = cls.newInstance(); System.out.println(obj);
     
    可以传参
    Constructor c = cls.getConstructor(String.class); c.newInstance("aaa");
     
     
     
    field
     
    获取所有属性
    Field[] declaredField =cls.getDeclaredFields(); for (Field filed:declaredField) { System.out.println(filed.getName()); }
    使用Filed类的一个实例,来描述cls类的实例中的"一个"属性
    Field field =cls.getDeclaredField("gender");
    获取属性的名字
    System.out.println(field.getName());
    获取属性的类型
    Class strcls =field.getType(); System.out.println(strcls.getName());
    获取属性的限定符
    int modifiers =field.getModifiers(); System.out.println(modifiers);
     
    创建Dog类的一个对象
    Dog d = new Dog("旺财","母"); System.out.println(d.getGender());
    暴力设置:设置field的访问
    field.setAccessible(true);
     
    有d对象,希望给d对象的gender属性赋值,可以使用set方法
    field.set(d, "公"); System.out.println(d.name); System.out.println(field.get(d));
     
     
    method
    通过cls.getDeclaredMethod获取Method对象
    Method m=cls.getDeclaredMethod("run",String.class,int .class); Method m=cls.getDeclaredMethod("eat",null);
     
     
    获取方法名
    System.out.println(m.getName());
     
    方法的返回值类型
    Class returntype = m.getReturnType(); System.out.println(returntype.getName());
     
    方法的参数类型
    Class[] paraType = m.getParameterTypes(); for (int i = 0; i < paraType.length; i++) { System.out.println(paraType[i].getName()); }
    获取方法的修饰符
    int modifiers = m.getModifiers(); System.out.println(modifiers); Dog d = new Dog("旺财", "母");
     
     
    方法是可以执行的,使用invoke执行method对象所表示的方法
    m.invoke(d, "aaa",123);
    m为静态
    m.invoke(null,null);
     
     
     
     
    /使用反射相关类,为对象p设置name属性的值
    Person p=new Person();
     //使用反射相关类,为对象p设置name属性的值 
    Class cls=p.getClass(); 
    Field[] fs=cls.getDeclaredFields(); 
    for (int i = 0; i < fs.length; i++) { 
    Field f = fs[i]; 
    if(f.getName().equals("name")) {
     String setName = "set"+f.getName().substring(0, 1).toUpperCase()+ f.getName().substring(1);
     //设置器的形参和属性的类型应当一致
     Method m = cls.getDeclaredMethod(setName, f.getType());
     //相当于p方法调用了setName方法
     m.invoke(p, "张山"); 
    }
     } 
    System.out.println(p.getName());
     
     
  • 相关阅读:
    Maven仓库是什么
    什么是Maven
    Shiro 的优点
    shiro有哪些组件
    Python偶斐波那契数
    Python求1000以内所有3或5的倍数的和。
    python"TypeError: 'NoneType' object is not iterable"错误解析
    python中列表常用的几个操作函数
    反射类的一些基本用法
    循环随机数短时间内大多都是重复的问题
  • 原文地址:https://www.cnblogs.com/aknife/p/10758783.html
Copyright © 2011-2022 走看看