您的位置:首页 > 编程语言 > Java开发

Test4_理解java反射机制的概念以及应用

2011-08-14 23:30 537 查看
1.反射就是把Java类中的各种成分映射成相应的java类;

--------------------------------------------------------------------

2.一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示
,通过调用Class类的方法可以得到这些实例对象后,得到这些事例对象
有什么用呢?怎么用呢?这正是学习和应用反射的要点。

--------------------------------------------------------------------

Constructor 类  字节码中的构造方法

--------------------------------------------------------------------

3.
Constructor[] constructor = Class.forName("java.lang.String").getConstructor()


//得到String类所有的构造方法

Constructor constructor = String.class.getConstructors(StringBuffer.class);
//表示得到一个参数是StringBuffer类型的构造方法
String str2 = (String)constructor.newInstance(new StringBuffer("xxx"));
//利用刚才取得String类构造方法的实例 new一个对象   注意:参数要相符取得什么参数的构造方法
//  new对象的时候就传什么参数


        上面两行代码中,在编译的时候并不知道第二行中的constructor对象是哪个类的构造方法
只知道他是一个构造方法,而在运行期,通过执行第一行代码,constructor才被覆上值,证明他是
String类型的构造方法,但是这点在编译的时候是不得而知的,所以 .newInstance()方法返回的是Object
类型的对象。
编译(翻译成.class)的时候,只是进行语法检查,并不执行
---->之前没有明白的问题,今天终于解开了 

--------------------------------------------------------------------

4.也可以通过Class.newInstance() 实例化一个 对象
->通过看JDK源代码得知,Class.newInstance()方法是先取得无参的构造方法,然后缓存起来,再实例化对象
以后再实例化的时候就不用实力化了,而是直接到内存中调用,

从以上也可以从侧面反映出,反射消耗性能(缓存缘故)

--------------------------------------------------------------------

Field 类   -->字节码中的成员变量 

--------------------------------------------------------------------

5.
public class ReflectPoint{
private int x;
public int y;
public ReflectPoint(int x,int y){
this.x = x;
this.y = y;
}
}
public class ReflectTest	{
public static void main(String[] args){
ReflectPoint pt1 = new ReflectPoint(3,5);
Field fieldY = pt1.getClass().getField("y");
//fieldY的值是5吗? 错! ReflectPoint可以生成多个对象 每个对象都有fieldY
//fieldY代表类中的变量  而不是对象的变量,要用它去取每个对象上的fieldY的值
fieldY.get(pt1);
//取出pt1对象的fieldY的值

//		Field fieldY = pt1.getClass().getField("x");
//		fieldX.get(pt1);//此时报错 因为x是private的修饰的  看不见

Field fieldX = pt1.getClass().getDeclareField("x");//看见了 拿不到
fieldX.setAccessible(true);// 加此句 能拿到了
System.out.println(fieldX.get(pt1));
}
}


--------------------------------------------------------------------

6.题目:把一个类中的所有Stirng类型的变量中的"b"换成"a";
import java.lang.reflect.Field;
class Person{

String name ="abc";
int age =20;
String sex = "man";
String fav = "basketball";
}
public class Test {

public static void main(String[] args) throws Exception{

Person p = new Person();
Field[] f =p.getClass().getFields();
for(int i =0;i<f.length;i++){
if(f[i].getType()==String.class){

String s =(String)f[i].get(p);
s=s.replace("b", "a");
f[i].set(p, s);
//			System.out.println(f[i].get(p));
}
}
}
}


--------------------------------------------------------------------

Method 类   (字节码中的方法)

--------------------------------------------------------------------

7. 取得String类的charAt()方法
Method methodCharAt = String.class.getMethod("charAt",int.class);//第一个参数是方法名,第二个参数是方法参数的Class类型
System.out.println(methodCharAt.invoke(str1,1));//如果Str="abc" 打印值为 b
//str1在这里是指调用此方法的变量 ,1是指调用此方法传的参数(charAt方法)
//如果为静态方法,则写null
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐