---------------------- android培训、java培训、期待与您交流! ----------------------
基础要点
1、构造方法的反射
2、成员变量的反射
3、方法的反射
例如得到某个类的所有构造方法或某个构造方法的例子:
package horse;
import java.lang.reflect.*;
/**这是一个构造方法的反射例子
*/
public class ConstructorReflect {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Constructor<?> constructor = String.class.getConstructor(new Class[]{byte[].class});
String st =(String)constructor.newlnstance(new Object[]{"abc".getBytes()});
String sts = (String)construtor
System.out.println(st.charAt(2));
System.out.println(st.indexOf("b"));
}
}
总结:Constructor[] constructors=Class.forName("java.lang.String").getConstructors();用于得到所有类的构造方法;Constructor constructor=Class.forName("java.lang.String").getConstructor(StringBuffer.class);用于得到某一个构造方法,括号内的是构造方法的参数的Class对象
再例如得到某个类的成员变量
package horse; /**这是声明了一个类用于测试成员变量的反射 */ public class FieldTest { //声明两个变量,一个私有,一个共有,用于演示暴力反射 private int x; public int y; public FieldTest(int x, int y) { super(); this.x = x; this.y = y; } }
package horse; /**这是一个成员变量反射的例子 */ public class FieldReflect { /** * @param args */ public static void main(String[] args) { //已知这两个参数一个是私有的,一个是共有的 FieldTest f = new FieldTest(2,5); //共有变量的取出方式 Field fy = f.getClass().getDeclaredField("y"); System.out.println(fy.get(f)); //私有变量的取出方式,很暴力 Field fx = f.getClass().getDeclaredField("X"); fx.setAccessible(true); System.out.println(fx.get(f)); } }
总结:Field[] Field=Class.forName("java.lang.String").getFields(),用于得到某个类所有的属性;Field Field=Class.forName("java.lang.String").getField(String pName),用于得到某个属性;这两个都推荐使用getDeclaredField(String pName)
第三个例子是关于方法的反射
package horse; /**这是一个成员方法的反射例子 */ public class MethodReflect { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 Class cl = FieldTest.class; Method[] methods = cl.getMethods(); for(Method m:methods){ System.out.println(m); } //获取FieldTest中的函数 methods = cl.getDeclaredMethods(); for(Method m:methods){ System.out.println(m); } } }
总结:getMethod()/getField()和getDeclaredMethod()/getDeclaredField()的区别
前者只能返回public类型,后者无此限制
感受:这两天我的柜子锁上的钥匙丢了,我就想到如果能用暴力反射把柜子里的私有变量(我的鞋)给弄出来多好啊,为此我还研究了好半天开锁呢!我也只是想想怎么可能真把鞋反射出来,开个玩笑。看了些资料这反射主要还是用于WEB开发后台连接数据库这块,在写JavaBean用的较多
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima