j2se----反射

[code]

为什么要有反射。。。?
答:可以根据别人给我的一个字符串动态的调用它指定的类。。。。

反射的基石是----Class这个类
因为他是所有.class文件的抽象,而Class的实例就代表内存中的一段字节码或者理解为某一个具体的.class文件

如何得到字节码的实例对象:
Class.forName("java.lang.String");//先到内存中去找字节码,如果找到就直接返回,如果没有则用内加载器去加载,然后再去内存中拿
Date.class或new Date().getClass()或Class.forName("java.util.Date")都额可以得到这个字节码而且是同一个,注意第三个最灵活

反射就是:把某个java类中的每一个成分解析都成为一个java类,如Method类,Field类。。。。

1。Constructor cons = String.class.getConstructor(StringBuffer.class);
String s = (String)cons.newInstance(new StringBuffer("aaa"));

想要new 一个东西,那么得到它的构造器就可以new....

2。Field代表一个类上的成员变量,而不是一个对象上的成员变量。。。

AA aa = new AA(3,5);
Field fieldY = aa.getClass().getField("y"); //注意,这个fieldY还只是类上的哦。。。而且这个Field不是所有的Field,而是允许访问的而已
fieldY.get(aa);//这是得到aa对象上的FieldY变量,这时这个y不能是私有的哈。。。

如何得到私有的实例变量呢?
AA aa = new AA(3,5);
Field fieldX = aa.getClass().getDeclaredField("x"); //这时就可以看到所有的申明的实例变量了,但还拿不到
fieldX.setAccessible(true);//这行代码被称作暴力反射,虽然私有的不让拿,那么我就抢
fieldX.get("aa");//这时就可以拿到私有的域值了

3。Method代表一个类上的方法。。。
String str1 = "abc";
Method charAtMethod = String.class.getMethod("charAt",int.class);//意思是得到参数是int的charAt方法
charAtMethod.invoke(str1,1); //调用str1上的这个方法,参数是1
charAtMethod.invoke(null,1);//调用静态的这个方法,参数是1

4。数组的反射,有点区别的是数组的反射要借助数组的静态反射类

private static void printObject(Object obj){
Class clazz = obj.getClass();
if(clazz.isArray()){
int len = java.lang.reflect.Array.getLength(obj);
for(int i=0;i<len;i++){
System.out.println(Array.get(obj, i));
}
}else{
System.out.println(obj);
}
}


5。 用反射穿透泛型。。。因为泛型是给编译器看的,编译器看完之后会擦除泛型
List<String> list = new ArrayList<String>();
//list.add(1);---不能这么搞,因为编译器会说 哥们,你写错了

list.getClass().getMethod("add", Object.class).invoke(list, 1);
这样就穿透泛型了。。。

6。我传给你一个对象 obj,我可以通过反射知道这个obj里面到底有些什么东西,但是我得不到obj自己是个什么东西。。。。怎么办?

答案是没办法,但是如果一个 List<Date> a = new ArrayList<Date>();
如果我想知道这个List里面是什么类型则可以办到

思路是,先定义一些方法,然后把这个obj传到哪个方法里面去,看他匹配哪个方法就知道了。。。
Method m = DaoUtil.class.getMethod("myType", List.class);
Type[] types = m.getGenericParameterTypes();
ParameterizedType type = (ParameterizedType)types[0];
System.out.println(type.getActualTypeArguments());//这个是得到哪个Date
System.out.println(type.getRawType());//这个是得到java.util.List


7。 Class c1 = "abc".getClass();
Class c2 = "aaa".getClass();
System.out.println(c1 == c2);

打印出来的是true ; 因为虽然"abc"和"aaa"的实例是不一样的,但是他们都是String类,那么加载到内存的字节码是一样的。。。


[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值