反射

作者: 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());

相关文章

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 镜面反射矩阵的推导

    镜面反射是以镜面作为反射平面,实物与反射物到反射平面的距离相等,实物与反射物方向相反,所以,反射矩阵由反射平面确定...

  • reflect.go包学习_之二 指针操作提高反射性能 反射应用

    reflect.go包学习_之二 指针操作提高反射性能 反射应用 反射创建实例 反射信息、反射调用方法、反射修改值...

  • Java互联网公司-经典面试题附答案

    基础:Java 反射?反射有什么缺点?你是怎么理解反射的(为什么框架需要反射)?优点:反射具有解耦性,缺点:反射属...

  • Java反射与joor反射库的使用

    java原生反射的使用 反射构造对象 反射方法 反射字段 joor反射库的使用 github:https://gi...

  • Java反射

    什么是反射? 反射的作用? 反射性能优化?

  • 反射三定律

    反射第一定律:反射可以将interface类型变量转换成反射对象 反射第二定律:反射可以将反射对象还原成inter...

  • 反射

    1.反射是什么?反射的定义,概念 2.为什么要学反射? 3.怎么使用反射?反射的使用

  • 一周岁前做好两件事,孩子就不会语言迟缓,保证口齿伶俐

    与语言发展相关的原始反射有四个:张口反射、足跖反射、抓握反射和手拉反射,每个反射的发生、发展和整合都是次第进行的,...

  • 面试官问go反射第一弹

    目录 反射概念 reflect包 反射类型(Type)和种类(Kind) 反射类型(Type)使用 反射类型对象(...

网友评论

    本文标题:反射

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