java反射的概念:java的反射机制是指在运行状态下,对于一个类来说,可以得到这个类的所有方法和属性。对于一个对象来说,可以调用这个对象的人和方法和属性。 反射机制首先会拿到该类的字节码文件(Class文件),然后反向获取这个类的所有信息。(注意:一个类型的类在运行中,只产生一个class文件)

既然反射的前置条件是获取class类,所以不得不提出获取class的方法。

获取class的几种方式:

(1)Persion p=new Persion();

Class c=p.getClass();

该方法不推荐使用,因为已经有了persion对象,反射多此一举。

(2)Class c=Persion.class;

任意的类都是继承object类,任何类也都有.class属性,说明object里面有一个class用来获取类的信息,但是该方法需要倒入包,依赖强。

(3)Class c =Class.forName("com.xxxx.xxxx")

推荐第三种,无序导包,效率较高。

以上三种方法获得的c对象都是同一个对象,因为类在运行的过程中,只产生一个class文件。

反射重要的类和方法

(1)Class类

getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。

boolean isPrimitive = class1.isPrimitive();//判断是否是基础类型
boolean isArray = class1.isArray();//判断是否是集合类
boolean isAnnotation = class1.isAnnotation();//判断是否是注解类
boolean isInterface = class1.isInterface();//判断是否是接口类
boolean isEnum = class1.isEnum();//判断是否是枚举类
boolean isAnonymousClass = class1.isAnonymousClass();//判断是否是匿名内部类
boolean isAnnotationPresent = class1.isAnnotationPresent(Deprecated.class);//判断是否被某个注解类修饰 String className = class1.getName();//获取class名字 包含包名路径
Package aPackage = class1.getPackage();//获取class的包信息
String simpleName = class1.getSimpleName();//获取class类名
int modifiers = class1.getModifiers();//获取class访问权限 Class<?>[] declaredClasses = class1.getDeclaredClasses();//内部类
Class<?> declaringClass = class1.getDeclaringClass();//外部类

(2)Field类(一般于Class类连用)

Class c =Class.forName("XXXX");

Field  fields=c.getDeclaredFields("fieldName");

fields.setAccessible(true);//设置私有变量可访问

Object obj=c.newInstance();

fields.set(obj,"xxx")//设置变量的值

(3)Method

Class.forName("com.XXX.XXX." + className).newInstance().getMethod("methodName").invoke("methodName",String ...)//调用反射对象的方法

(4)Constructor类

Constructor<?> cons=Class.forName("com.XXX.XXX." + className).getConstructor(Param.class)//Param可谓int,String,Object等,对应着对象的param类型的构造方法。

cons.newInstance(Param.class.newInstance());//param的具体值(对象)

反射的应用场景:

(1)简单工厂

(2)代理模式

(3)一般还和配置文件共同使用

Class clazz = Class.forName("com.XXX.XXX." + className);//className为配置文件className的值
Object obj = clazz.newInstance();
Method method = clazz.getMethod(methodName);//methodName为配置文件methodName的值
method.invoke(obj);

欢迎大家批评指正,共同学习,共同进步。

最新文章

  1. --关于null在oracle数据库中是否参与计算,进行验证,
  2. 如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)
  3. springmvc+mybatis+spring 整合源码项目
  4. git 删除错误提交的commit
  5. 【wikioi】2495 水叮当的舞步(IDA*)
  6. DEDECMS中,引入文件
  7. [.NET WebAPI系列01] WebAPI 简单例子
  8. ArcGIS for Android 中MapView的地图背景设置
  9. 51单片机C语言学习笔记5:include的区别
  10. JavaScript引用类型之Array数组的栈方法与队列方法
  11. windows一键安装包的升级禅道
  12. python常量 变量 数据类型 注释 交互 if语句
  13. 获取用户登陆所在的ip及获取所属信息
  14. 前端生成pdf
  15. mysql自增id超大问题查询
  16. require(&#39;./expample.js).default详解
  17. properties文件读取工具类
  18. Vue框架的两种使用方式
  19. DPDK架构与特点
  20. C++中static修饰的静态成员函数、静态数据成员

热门文章

  1. Day 21 序列化模块_Json,Pickle,Shelve
  2. 统计进程打开了多少文件,定位too many open files
  3. Masnory 学习
  4. Python os.path.join() 进行路径拼接
  5. 从getwebshell到绕过安全狗云锁提权再到利用matasploit进服务器
  6. webpack快速入门——配置文件:服务和热更新
  7. css 三角图标
  8. 前端小例子 基础js css html练习
  9. MFC 剪切板的使用、线程介绍
  10. WebForm——浏览器兼容、旋转、缩放、倾斜、移动