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

java反射机制

2015-10-02 11:08 260 查看
java反射机制:

java反射机制是在运行状态中,对于任意一个类(class 文件),都能够知道这个类的所有属性和方法

对于任意一个对象,都能够调用他的任意一个方法和属性

这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制

动态获取类中的信息,就是java反射。可以理解为对类的解剖

用于描述字节码文件的类 class  Class{ },这个类中提供了获取字节码文件中内容的方法

要想对字节码文件进行解剖,必须要有字节码文件

如何获取字节码文件对象,有三种方式:

1、Object类中的getClass( )方法的。

       想要用这种方式,必须要明确具体的类,并创建对象,麻烦

       例如:Person  p = new Person( );  Class clazz = p.getClass;

 2、任何数据类型都具备一个静态的属性。class来获取其对应的class对象

        相对简单,但是还是要明确到类中的静态成员,还是不够扩展
Class clazz =Person.class();

 3(重点)、只要通过给定的类的字符串名称就可以获取该类,更为扩展

                  可以用Class类中的方法完成,该方法就是forName
 这种方式只要有名称就可以,更为方便,扩展性更强
 String  className =“cn.itcast.bean.Person”;注意:要有完整的包名
 Class clazz = Class.forName(className);

  (1)、获取构造函数

  newInstance();创建此class对象所表示的类的一个新实例

  一般被反射的类都带有空参的构造函数,没有空参构造函数时要怎么做呢?

  getConstructors(可变参数);获得类中的公共构造函数,只能是公共的

  例如:Constructor constructor = clazz.getConstructors(String.class,int.class);

        //通过该构造器的newInstance方法进行对象的初始化

        Object obj = constructor.newInstance("小明",38);

  getDeclaredConstructors获取类中所有的构造函数,包括私有构造函数,但只是本类中的

  (2)、获取字段

  Field field = clazz.getDeclaredField("age");

  //对私有字段的访问取消权限检查.暴力访问

  field.setAccessible(true);

  Object obj = clazz.newInstance();

  field.set(obj,89);

  Object o = field.get(obj);

  (3)、获取方法

  Methods [] methods = clazz.getMethods();//获取所有的公共方法

  methods =  clazz.DeclaredgetMethods();

  for(Method method:method){

    System.out.println(method);

  }

  Method method = clazz.getMethod("show",null);//获取一个空参数的函数名为show的方法,第二个参   数是可变参数

  //Object obj = clazz.newInstance();

  Constructor constructor = clazz.getConstructor(String.class,int.class);

  Object obj = constructor.newInstance("小明",38);

  mehtod.invoke(obj,null);

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: