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()方法是一样的

  • 相关阅读:
    io系列之常用流一
    C++ 函数参数的默认值
    C++ 函数匹配和作用域声明
    c++ vector 迭代器 demo
    C++ 函数重载和匹配
    C++函数重载和const
    C++函数重载
    iOS开源项目
    Linux系统/网络 笔记
    IO五种模式
  • 原文地址:https://www.cnblogs.com/li7anStrugglePath/p/12726791.html
Copyright © 2011-2022 走看看