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

来源:互联网 发布:知著投资咨询有限公司 编辑:程序博客网 时间:2024/04/30 19:28
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


原创粉丝点击