java反射机制的使用

一、反射是什么?

JAVA反射机制是在运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类信息以及动态调用对象内容就称为java语言的反射机制。

二、反射的作用

  • 在运行时判断任意一个对象所属的类;
  • 在运行时构造任意一个类的对象;
  • 在运行时判断任意一个类所具有的成员变量和方法;
  • 在运行时调用任意一个对象的方法;

三、反射的实现

我们知道,要使用一个类,就要先把它加载到虚拟机中,生成一个Class对象。这个class对象就保存了这个类的一切信息。
反射机制的实现,就是获取这个Class对象,通过Class对象去访问类、对象的元数据以及运行时的数据。

四、反射机制中使用的类

  • java.lang.Class; 类的对象代表一个类的所有
  • java.lang.reflect.Constructor; 类的对象代表构造函数
  • java.reflect.Filed; 类的对象代表属性
  • java.lang.Method; 类的对象代表方法
  • java.lang.Modifier; 类的对象代表修饰符

五、反射机制的使用

1、获取Class对象的三种方式

//方式一:引用保存内存地址中堆中的对象
Class class = Class.forName(className);
//方式二:java语言种任何一个java对象都有getclass方法
Class class = 对象名.getClass();
//方式三:java中每个类型都有class属性
Class class = 对象名.class;

2、通过class对象创建一个java象

Obiect obj = class.newInstance();

3、在运行时,获取自己的父类信息

Class<?> parentClass = class.getSuperClass();
String parentName = parentClass.getName();
//获取父类多个接口
Class[] ins = parentClass.getInterfaces();
for(Class in :ins){System.out.println(in.getName());
}

4、获取类的全部方法存于一个数组中

//返回声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法
Method[] ms = class.getDeclaredMethods();
//返回可被访问的公共方法
Method[] ms = clazz.getMethods();
for(Method m : ms){//方法的返回值类型Class returnType = m.getReturnType();//得到类型的简写名称System.out.println(returnType.getSimpleName());//方法名System.out.println(m.getName());//按照声明顺序返回 Class 对象的数组,这些对象描述了此 Method 对象所表示的方法的形参类型Class [] ParameterType = m.getParameterTypes();
}

反编译类的某个method方法

class  Test{public boolean login(String name,String pwd){if("z".equals(name)&&"123".equals(pwd)){return true;}return false;}public void logout(){System.out.println("已退出");}
}public static void main(String[] args) throws Exception {//获取类Class c = Class.forName("Test");//获取某个特定的方法,通过方法名加形参列表Method login = c.getDeclaredMethod("login",String.class,String.class);//通过反射机制执行login方法Object o = c.newInstance();//调用o对象的m方法,传递两个参数将结果存放在reValue中Object reValue = login.invoke(o,"z","123");System.out.println(reValue);}

5、获取类的全部字段,存于一个数组中

// 取得本类已声明的所有字段,包括私有的、保护的
Field[] fields = clazz.getDeclaredFields();
// 取得本类中可访问的所有公共字段
Field[] fileds = clazz.getFields();
for(Field filed:fileds ){Class type = field.getType();//获取类型的第一种方式System.out.println(type.getName());//获取类型的第二种方式System.out.println(type.getSimpleName());
}

反射某个类具体的某个Field

public static void main(String[] args) throws Exception{//获取类Class c = Class.forName("User");//获取id属性Field idf = c.getDeclaredField("id");//获取某个特定的属性可以用来代替set..,get..Object o = c.newInstance();//打破封装,导致java属性不安全idf.setAccessible(true);idf.set(o,"001");System.out.println(idf.get(o));//001}

6、获取类的全部构造函数,存于一个数组中

Constructor[] cs = class.getDeclaredConstructors();
for(Constructor con : cs){//获取修饰符System.out.println(Modifier.toString(con.getModifiers()));//获取构造方法名System.out.println(c.getName());//构造方法的形式参数列表Class [] parameterTypes = con.getParameterTypes();
}

获取某个类的某个构造方法并创造一个对象

//写的一个实体
class Customer{String name;int age;Customer(String name,int age){this.name = name;this.age=age;}public String toString(){return "Customer["+name+","+age+"]";} }class Test{public static void main(String[] args) throws Exception {//获取类Class clazz = Class.forName("Customer");//获取特定的构造方法Constructor con = clazz.getDeclaredConstructor(String.class,int.class);//创建对象Customer customer = (Customer)con.newInstance("zhangsan",90);System.out.println(customer);}}

六、反射机制的优缺点

优点:

  1. 增加程序的灵活性,避免将程序写死到代码里。
  2. 代码简洁,提高代码的复用率,外部调用方便。
  3. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。

缺点:

  1. 性能问题
    使用反射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。
    反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被 执行的代码或对性能要求很高的程序中使用反射。
  2. 使用反射会模糊程序内部逻辑
    程序人员希望在源代码中看到程序的逻辑,反射等绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。
  3. 安全限制
    使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。
  4. 内部暴露
    由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。

java反射机制的简单使用和优缺点相关推荐

  1. Java反射机制(简单易懂)

    文章目录 前言 一.反射机制 二.反射的用途 三.反射相关的类(重要) 3.1 Class类(反射机制的起源 ) 3.2 通过反射调用构造方法 3.3 通过反射调用普通方法 3.4 通过反射调用类属性 ...

  2. Java反射机制的基本概念与使用_Java进阶之reflection(反射机制)——反射概念与基础...

    反射机制是Java动态性之一,而说到动态性首先得了解动态语言.那么何为动态语言? 一.动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化.比如常见 ...

  3. Java反射机制及API使用

    原文地址 反射简单来说,就是动态加载对象,并对对象进行剖析.在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道并获取这个类的所有属性和方法. Java反射机制的作用: 在运行时判断任意 ...

  4. Java反射机制概念及应用场景

    Java反射机制概念及应用场景 Java的反射机制相信大家在平时的业务开发过程中应该很少使用到,但是在一些基础框架的搭建上应用非常广泛,今天简单的总结学习一下. 1. 什么是反射机制? Java反射机 ...

  5. Java反射机制是什么?

    Java 反射机制是 Java 语言的一个重要特性.在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期. 编译期是指把源码交给编译器编译成计算机可以执行的文件的过程.在 Java 中 ...

  6. Java:反射机制学习

    文章目录 前言 一.Java反射机制具体是什么 为什么Java要有反射机制,为什么像C++之类的语言不需要有反射机制 反射机制宏观上能让我们做些什么 二.通过反射获取运行时标识Class类 1.Cla ...

  7. 理解Java反射机制

    理解Java反射机制 1. 概述 2. 反射原理 3. 反射的优缺点 4. 反射的用途 5. 反射相关的类 5.1 Constructor 5.2 Field 5.3 Method 5.4 Class ...

  8. java面试题--java反射机制

    Java反射机制的作用: 1)在运行时判断任意一个对象所属的类. 2)在运行时判断任意一个类所具有的成员变量和方法. 3)在运行时任意调用一个对象的方法 4)在运行时构造任意一个类的对象 拓展: 1. ...

  9. 月黑雁飞高,反射全知道——剖析java反射机制

    文章目录 java 反射机制 反射机制概念 java反射提供的功能 反射的基本使用 反射使用步骤(获取Class对象.调用对象方法) 反射使用 例子People 获取Class的三种方法(获取一个类的 ...

最新文章

  1. Python中*args 和**kwargs的用法探讨
  2. c盘python27文件夹可以删除嘛_C盘的文件夹哪些可以删除
  3. 8 关于数据仓库维度数据处理的方法探究系列——父子维
  4. asp.net cache
  5. java配置struts2_[Java教程]struts2配置
  6. [转载] Python基础——Numpy库超详细介绍+实例分析+附代码
  7. 机器学习初探:Logistic选股模型实证
  8. 需求分析文档、概要设计文档、详细设计文档
  9. 【程序员日记】快乐的一周嘛(第8期)(财富、快乐、技术)
  10. 百练2967:特殊日历计算题解
  11. 大数据笔记--scala(第一篇)
  12. linux下使用360wifi3,360 随身 WiFi3 在 Ubuntu 14.04 下的使用
  13. Python彩色字符画
  14. ADC或DAC中的LSB
  15. 玉柴spn码故障对照表_玉柴ECI故障码表
  16. CLOB 和 BLOB
  17. DTX编解码原理New
  18. html5 涂鸦板
  19. Three.js MMDLoader.js Mmd模型的加载 pmx模型加载测试
  20. 读书笔记 - 学会写作: 五个吸引人的情节套路

热门文章

  1. 方案计数(带修计数题/线段树)
  2. P3355 骑士共存问题(网络流)
  3. Codeforces Round #701 (Div. 2) D. Multiples and Power Differences 思维构造
  4. 【集训队作业2018】复读机【指数型生成函数】【单位根反演】【二项式定理】
  5. JavaWeb --第一章Web基本概念
  6. [NOI2009] 变换序列 (匈牙利最大匹配)
  7. P4640-[BJWC2008]王之财宝【OGF,Lucas定理】
  8. P4735-最大异或和【可持久化Trie】
  9. 【DP】数的划分(ybtoj DP-1-3)
  10. eclipse开发jsp默认编码设置