A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 以梦为码 中级黑马   /  2015-7-21 19:04  /  355 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

反射
  程序运行期间,JVM会对类文件创建字节码文件对象,利用这个文件对象,对这个
  class文件进行解剖,直接获取成员,调用这些成员。这种动态的获取一个类中的信
  息,就是反射技术
如何获取字节码文件对象?
     方式1:getClass():返回进行时的类
     方式2:类名.class静态属性,来获取当前数据类型的字节码文件对象
     方式3:public static Class forName(String className)返回与带有给定字符串名
            的类或接口相关联的Class对象
  构造函数:Constructor
          public Constructor[] getConstructors():获取所有的公共的构造函数
          public Constructor[] getDeclaredConstructors();获取所有的构造函数(包含私有)
          public Constructor getConstructor(Class<?>...parameterTypes)获取指定的构造函数
          public void setAccessible(boolean flag);是否可以访问(暴力访问)
          步骤
             1、创建一个Class字节码文件对象
             2、非public权限的构造函数,需要强制访问
             3、创建对象
          例:
             import java.lang.reflect.*;
         public class ReflectDemo4 {
         public static void main(String[] args) throws Exception{
                Class clazz = Class.forName("cn.itcast.reflect.Person");
                //获取私有构造方法 int参数
                Constructor con = clazz.getDeclaredConstructor(int.class);
                //调用Constructor父类(AccessibleObject)方法 setAccessible(true)
                //setAccessible反射的时候,取消访问检查
                con.setAccessible(true);
                Object obj = con.newInstance(331);//构造函数,传递实际参数
                System.out.println(obj);
           }
        }
    获取成员变量:Field
         public Field[] getFields()获取public修饰的所有字段
         public Field[] getDeclareFields()获取所有的字段(包含私有)
         public Field[] getField(String name)获取指定的字段
         public Field[] getDeclareField(String name)获取所有的字段(包含私有)
         为指定对象中的当前字段,赋值
          public void set(Object obj,Object value);
     步骤:
       1、创建class字节码文件对象
       2、获取指定的字段,如果是非public修饰的字段,需要暴力访问
       3、对字段进行操作
   调用给定的对象中的当前方法,并且给定方法的参数列表,这个时候就可以确定调用的是具体的哪个方法了
        public Object invoke(Object obj,Object..args)
  获取方法:Method
         public Method[] getMethods()包含父类
         public Method[] getDeclareMethods()获取所有的方法(不包含父类)
         public Method[] getMethod(String name,Class<?>...parameterTypes)获取指定的方法
         public Method[] getDeclareMethod(String name,Class<?>...parameterTypes)获取所有的方法(包含私有)
      调用给定
      步骤:
         1、创建class字节码文件对象
         2、获取指定的方法
         3、使用方法(需要前有对象,才能使用方法)



         

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马