JAVA-------反射机制

android培训java培训、期待与您交流!

        今天学习了java反射的机制,感觉有点纠结不过还是看完了,认真的把老师上面讲的知识理解明白后,然后再自己敲代码,觉得这个反射机制就是通过Class类映射到某个对象。其中的玄妙比较神奇。

        首先是说要把某个对象或者说某个类抽象成为一个字节码,每一种的类的字节码都是相同的,说对于一个类的所有对象的字节码都是某个字节码,该字节码和该类的字节码相同。获得字节码的方法有三种,现在假设使用String s = “abc”这个对象来说:
        ① s.getClass();该方法是所有类的父类Object的方法,返回一个Class对象,就是一个自己码。原型:Object<?> getClass();
        ② String.class;直接类名.class就表示该类的字节码;
        ③ Class.forName(“java.lang.String”);调用Class类中的forName(String classname)方法来获得String类的字节码,即Class对象。原型:static Class<?> forName(String classname); 
         在获得了字节码后或Class对象后,就可通过该Class对象来对某个类的任何对象进行操作。比如可以获得该类的构造方法,获得该类的成员变量以及所有的方法;
如何获得构造方法并进行调用?
         假设我们最后要完成的功能是实现new String(new StringBuffer(“abc”))的功能,通过反射来实现的话,首先我们要得到String的Class对象,然后再利用Class类的获得构造方法的方法来得到构造方法,然而Class类中有两个这样的方法①Construtor<T> getConstructor(Class<?>…parameterType);②Constructor<?>[] getConstructors() ;第一个方法是用来得到某个确定的构造方法,如我们现在就是要获得参数为StringBuffer的构造方法,那么我们就可用这个构造方法,不过这里面的参数列表都是Class对象的,所以我们调用的时候就StringBuffer.class才行。第二个方法是用来获得该类中所有的构造方法;对于这两个方法最后都是返回一个Constructor对象的,就是说把那个要操作的类的构造方法封装为一个对象,然后利用该对象中的方法进行对象的实例化等。
         现在来实现上面说的new String(new StringBuffer(“abc”)):         
Constructor c = String.class.getConstructor(StringBuffer.class);
String s = (String)c.newInstance(new StringBuffer(“abc”));
         在这个过程中我们得到了确定的构造方法,然后调用Constructor类中的newInstance(Object参数)这个方法返回一个实例对象,如果之前在声明该Class对象是String类型的话,这里就是String类型的对象。
         获得构造方法才是开始,同样我们可以通过反射来获得某个类的成员变量,并把该变量封装为Field类型的对象。同样是利用该Field中的方法得到该字段的值,通过set方法来设置对象这个字段的值;这两个方法是:Object get(Object obj)和void set(Object obj,Object value);
现在假设某个类A中有两个成员变量private int x;public int y;然后我们想通过反射来获得这个类的对象的两个成员变量:【A类的对象 AA(3,4)】       
Field field = AA.getClass().getFeild(“y”); //获得y属性的字段并封装为Field的对象
field.get(AA);//获得AA对象在field字段的值
        如果要获得x的值,由于是私有属性,那么在获得属性字段的时候就必须使用另一个方法来使得我们可以看到这个私有的字段。看是看到了,如果想获得该字段的值,还要使用一个字段可使用的函数设置为真,否则就不能进行相关的操作了。      
Field field = AA.getClass().getDeclaredFeild(“x”);
field.setAccessible(true);
field.get(AA);
       如果现在假设我想把AA(3,4)改为AA(3,5);那么我们在获得A类的y字段后在使用上面说的set方法;     
Field field = AA.getClass().getFeild(“y”);
field.set(AA,5);//表示把AA对象的field字段设置为5;
       获得方法的时候就调用Class的Method getMethod(String name,Class<?> parameterTypes)得到名为name参数为parameterType的方法并且会封装为Method类型的对象,在调用Method类的Object invoke(Object obj,Object…args)来执行该方法;
如String s = “abc”;现在假设要实现的是s.charAt(2)的话,下面是代码:
Method m = s.getClass().getMethod(“charAt”,int.class);//获得名为charAt参数为int的方法
m.invoke(s,2);//对对象s在位置2处执行m方法


android培训java培训、期待与您交流!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值