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());
     
     
  • 相关阅读:
    SoapUI 使用笔记
    git 使用笔记(二)
    git 使用笔记(一)
    jquery 拓展
    hdu 1024 Max Sum Plus Plus (DP)
    hdu 2602 Bone Collector (01背包)
    hdu 1688 Sightseeing (最短路径)
    hdu 3191 How Many Paths Are There (次短路径数)
    hdu 2722 Here We Go(relians) Again (最短路径)
    hdu 1596 find the safest road (最短路径)
  • 原文地址:https://www.cnblogs.com/aknife/p/10758783.html
Copyright © 2011-2022 走看看