java反射的初步探索
Posted li7anstrugglepath
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()方法是一样的
以上是关于java反射的初步探索的主要内容,如果未能解决你的问题,请参考以下文章