Java反射

来源:互联网 发布:冬天四件套绒淘宝 编辑:程序博客网 时间:2024/06/13 21:39

前言

  • 最近在做代码混淆的时候,发现使用反射的地方混淆之后,会出错,这里,将反射相关的问题记录下。

反射案例。

  • 所谓反射,就是在代码运行时动态获取类以及类的成员变量,通过一些例子来了解。

1.使用getClass来获取类。

public static void main(){Demo demo =new Demo();    System.out.println(demo.getClass().getName());}

上面的例子中,使用demo.getClass来动态获取类之后,可以通过getName()获取类的包名.

2.所有的类的对象都是Class对象的实例

package cax;class Demo{}public static void main(String [] args){    Class<?> demo1 =null;    Class<?> demo2 =null;    Classs<?> demo3 =null;    demo1 = new Demo().getClass();    demo2 = Demo.class;    demo3 = class.forName("cax.Demo"));    System.out.println(demo1.getName());}
  • 上面demo1,2,3的生成方式是三种类对象的获取方式,比较推荐的为demo3的生成方式,注意,这种方式需要类的全名,是包含包名的。

3.通过反射实例化对象

package cax;class Person{}demo = class.forName("cax.Person")Person pserson = (person)demo.newInstance();
  • 这里需要指出的是,当一个类有多个构造函数时,编译后的构造函数的顺序和代码中的顺序并不保证完全一样。
  • 其他的通过反射获取别的属性,方法,父类的方法等原理都是一样的,不再赘述。

4.获取类加载器的信息

demo = class.forName("cax.Demo");//得到类的字节码demo.getClassLoader();//得到类加载器的对象demo.getClassLoader().getClass()//再次通过反射,获取classLoader的类。demo.getClassLoader().getClass().getName();//获取classLoader的包名。

反射的使用场景

  • 在使用工厂类的时候
  • 最常见的是在获得jdbc驱动的时候。
  • 使用泛型的时候

参考

http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html
http://blog.csdn.net/ljphhj/article/details/12858767

原创粉丝点击