zoukankan      html  css  js  c++  java
  • java反射的初步探索

    reflect包中的Class类(注意是大写C)——类型标识类-Class

    import java.lang.reflect;

    反射reflection:程序可以访问、检测和修改它本身状态或行为的能力,即自描述和自控制。

           可以在运行时加载、探知、使用编译期间完全未知的类

           可以在运行时查看和操作对象:基于反射自由创建对象、set或get无法访问的成员变量、调用不可访问的方法等

    即,可以通过“反射”获得类的所有信息,比如

    1.Field:成员变量/属性

     1 class A{
     2     public int age;
     3     private String name;
     4   
     5     //A的构造函数
     6     public A(int age, String name)
     7     {
     8          this.age = age;
     9          this.name = name;
    10     }
    11 
    12 A obj = new A(20, "li7an");
    13 Class c = obj.getClass();//得到类型标识
    14 
    15 //获取本类及父类所有的public属性
    16 Field[] fs = c.getFields();
    17 
    18 //获取本类自己声明的所有public/protected/default/private属性
    19 Field[] fs2 = c.getDeclaredFields();
    20 for(Field f: f2)
    21 {
    22     f.setAccessible(true);//这个方法使得protected/private属性也可调用,临时都变为public的
    23 }

    2.Method:成员方法类

    class B{
    public void f1(){
    out.println("B.f1()");
    }
    private String f2(String s){
    out.println("B.f2()")
    return s;
    }
    B obj = new B();
    Class c = obj.getClass();
    
    //获取public方法
    Method[] ms = c.getMethods();
    for(method m:ms){
        if("f1".equals(m.getName())){
            m.invoke(obj, null);//反射中调用某个方法时,用invoke方法,此时必须传入一个对象如这里的“obj”后才能调用
        }
    }
    
    //获得该类的所有方法
    Method[] ms2 = c.getDeclaredMethods();
    for(Method m:ms2){
        if("f2".equals(m.getName())){
            m.setAccessible(true);//又来啦
            String result = (String)m.invoke(obj,"abc");
            out.println(result);
        }
    }

     这里的m.setAccessble(true);只是临时把private/protected方法变成了private不影响B类中其他对象,其new新的B类对象时,

    f2方法仍是不可见的

    ****************************************

    注:类名.class 和类名.getClass()方法是一样的

  • 相关阅读:
    P2617 Dynamic Rankings[带修主席树(模板)]
    P2617 Dynamic Rankings[带修主席树(模板)]
    P4127 [AHOI2009]同类分布
    P4127 [AHOI2009]同类分布
    P4550 收集邮票 [期望dp]
    P4550 收集邮票 [期望dp]
    P3168 [CQOI2015]任务查询系统
    蓝桥杯 2的次幂表示 递归
    蓝桥杯 最大的算式 dp
    蓝桥杯 未名湖边的烦恼 递推 dp
  • 原文地址:https://www.cnblogs.com/li7anStrugglePath/p/12726791.html
Copyright © 2011-2022 走看看