反射

作者: 71150ce14a00 | 来源:发表于2017-07-13 20:50 被阅读5次

    反射必须依赖Class类字节码文件

    获取Class对象三种方式
    1.类名.class String.class
    2.Object中的对象.getClass() "".getClass();
    3.Class 静态方法forName(name) Class.forName("包名.类名");

    为什么使用第三种方式:
    1.前两种必须知道类名,而第三种可以不用知道(根据key获取value类名)
    2.第一种不执行静态代码块, 第二种在堆内开辟空间,浪费资源,第三种加载静态代码块jdbc链接
    getName(); 获取指定类的全名 包名.类名
    getSimpleName() 简单的名字 类名

    预定义对象:8种基本数据类型+void

    Field(成员变量), Contructor(构造函数),Method(成员方法)

    Class 类中的newInstance() 根据Class创建对象
    参数: 无参
    局限性:
    要求在对应类中必须有无参构造函数

    Constructor类中的 newInstance(Object... initargs)
    参数initargs: 可以是无参,也可以是多个参数

    getDeclaredConstructor(Class...) 包括私有的构造方法
    setAccessible(true); 取消java的访问权限、暴力访问
    getConstructor(Class...) 不包括私有的构造方法

    Class clazz = Class.forName("java.io.File");
    Constructor con = clazz.getConstructors(String.class);
    File f = (File)con.newInstance("F:\1.txt");
    // 获取私有方法
    Constructor con = clazz.getDeclaredConstructor(String.class,File.class);
    con.setAccessible(true);
    File f =(File)con.newInstance("1.jpg",new File("D:\test"));

    获取方:
    getMethod()包括父类方法
    getDeclaredMethod(name,Class...) 不包括父类方法,如果方法没有参数,可以不写
    执行方法
    obj = invoke(obj,args) obj对象,如果是静态方法写null , args,参数:如果没有参数,,什么都不写
    obj 方法返回值,如果没有返回值,返回null

    获取属性

         // 获取私有属性
         Class clazz = Class.forName("com._21reflect.Person" );
         Person p = (Person) clazz.newInstance();
         Field f = clazz.getDeclaredField( "name");
         f.setAccessible( true);暴力访问
         f.set( p, "777");
         String s = (String) f.get( p);
         System. out.println(s );
         //获取共有属性
         Field f1 = clazz.getField( "age");
         f1.set( p, 23);
         System. out.println(f1 .getInt(p ));
    

    获取成员方法:

              Class clazz = Class.forName("com._21reflect.Person" );
             Person p = (Person) clazz.newInstance();
              // 有返回值,有参数的公开函数
             Method m = clazz.getMethod("show", String.class) ;
             String s = (String) m.invoke( p, "6666");
             System. out.println(s );
              // 私有函数
             Method method = clazz.getDeclaredMethod("getMessage", String.class );
              method.setAccessible( true);
             String str = (String) method.invoke( p, "777");
             System. out.println(str );
    

    获取构造方法:

              Class clazz = Class.forName("com._21reflect.Person" );
             Person p = (Person) clazz.newInstance();
              // 非私有
              Constructor c = clazz.getConstructor() ;
             Person f = (Person) c.newInstance();
              f.show( "sss");
              // 私有
              Constructor c2 = clazz.getDeclaredConstructor(String.class,int. class,String.class);
             Person p2 = (Person) c2.newInstance( "dubo",23,"北京" );
             System. out.println(p2 .getAddress()+p2.getName()+ p2.getAge());
    

    相关文章

      网友评论

        本文标题:反射

        本文链接:https://www.haomeiwen.com/subject/iheghxtx.html