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

原创 2012年03月24日 23:59:09

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培训、期待与您交流!


相关文章推荐

java反射机制

  • 2016年06月05日 21:04
  • 7KB
  • 下载

Java反射机制

  • 2015年02月27日 21:08
  • 845KB
  • 下载

利用java反射机制实现读取excel表格中的数据

如果直接把excel表格中的数据导入数据库,首先应该将excel中的数据读取出来。 为了实现代码重用,所以使用了Object,而最终的结果是要获取一个list如List、List等,所以需要使用泛型机...

Java 语言的反射机制

  • 2013年08月29日 22:43
  • 185KB
  • 下载

关于Java的反射机制,你需要理解这些..

反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。...
  • forezp
  • forezp
  • 2016年12月18日 21:53
  • 12734

Java泛型和反射机制

  • 2014年01月07日 11:20
  • 626KB
  • 下载

Java中类的反射机制

  • 2013年12月18日 19:58
  • 245KB
  • 下载

java中使用反射机制获取实体类集合的某个属性值

需求今天遇到一个需求。需要从几个对象的集合中取出对象的某些属性。怎么办呢?哪就利用反射机制写个方法吧。思路入参首先是几个对象的集合,那么方法的入参就是 list 因为是不同对象所以还是得用泛型。用反射...

JAVA反射机制和动态代理PDF

  • 2012年12月13日 14:55
  • 263KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA-------反射机制
举报原因:
原因补充:

(最多只允许输入30个字)