java反射机制的简单使用和优缺点

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. 内部暴露
    由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--代码有功能上的错误,降低可移植性。反射代码破坏了抽象性,因此当平台发生改变的时候,代码的行为就有可能也随着变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有关技术分享

有人说&#xff0c;如果你想掌握好一门技术&#xff0c;那么最好的方式就是去当老师&#xff0c;去教会别人这门技术。在教别人的过程中&#xff0c;你必须要去深入的了解这门技术的方方面面&#xff0c;同时还要思考怎么才能让别人理解。每一个做过的人都知道&#xff0c;这要…

不可重复 幻读

幻读和不可重复读的区别 2014年09月15日 20:51:27 阅读数&#xff1a;26195 MySQl MySql默认的隔离级别为Repeatable Read&#xff0c;因此只会出现幻读的情况。 幻读 事务在插入已经检查过不存在的记录时&#xff0c;惊奇的发现这些数据已经存在了&#xff0c;之前的检测…

java生成验证码

转载自 java生成验证码 源码&#xff1a; package seed.lee.image;import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random;import javax.imageio.ImageIO; …

ASP.NET Core 中文文档 第三章 原理(5)错误处理

原文&#xff1a;Error Handling作者&#xff1a;Steve Smith翻译&#xff1a;谢炀&#xff08;Kiler)校对&#xff1a;高嵩(jack2gs)、何镇汐 当你的ASP.NET应用发生错误的时候, 你可以采用本文所述的各种方法来处理这些问题。 配置错误处理页面 你在 Startup 类的 Configure(…

java面向对象高级分层实例_接口类

package bdqn.studentSys.Dao;import java.util.List;import bdqn.studentSys.entity.Student;/*** 学生表的接口* author Administrator**/ public interface StudentDao {//查询所有的学生public List<Student> getAllStudent();//修改学生信息public int UpdateStuden…

杀死进程

-- 杀死进程端口 netstat -aon|findstr "8086" taskkill /PID 9160 /f

菜鸟学Java(六)——简单验证码生成(Java版)

转载自 菜鸟学Java&#xff08;六&#xff09;——简单验证码生成(Java版)验证码大家都知道&#xff0c;它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释&#xff0c;一般验证码的生成就是随机产生字符&#xff08;数字、字母或者汉字等&#xff09;&#xff0…

对象集合中如何用对象的某个属性给对象排序?

这是在工作中遇到的一个问题。用到的持久层技术是mybatis-plus&#xff0c;它里面自带的条件对象wrapper&#xff0c;我们可以通过wrapper.orderByDesc()或者wrapper.orderByAsc()给我们list中的对象排序。 但是问题来了&#xff0c;如果公司在基于这个框架的基础上写了一个通用…

你知道C#中的Lambda表达式的演化过程吗

那得从很久很久以前说起了&#xff0c;记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂。 委托的使用 例一&#xff1a; 什么是委托&#xff1f; 个人理解&#xff1a;用来传递方法的类型。&#xff08;用来传递数字的类型有int、float、double&#xff0c;用…

拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码

使用 apache.http. 可以解决 压缩的json文件 浏览器会自动解压但我们的后台不会package com.zjyouth.utils;import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.…

java面向对象高级分层实例_数据库操作类

package bdqn.studentSys.Dao.impl; /**** 学生表的数据库操作类*/ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List;import bdqn.studentSys.Dao.BaseDao; import bdqn.studentSys.Dao.StudentDao; import bdqn…

shiro-权限概述

一、什么是权限 权限管理&#xff0c;一般根据系统的安全设置或安全规则&#xff0c;用户可以且只能访问自己被授予的资源。只要有用户名和密码&#xff0c;就一定会存在权限。 二、权限分类 访问权限 作为一个使用者或是访问者&#xff0c;你能够被允许看到的那些资源。 数…

ASP.NET Core Kestrel 中使用 HTTPS (SSL)

在ASP.NET Core中&#xff0c;如果在Kestrel中想使用HTTPS对站点进行加密传输&#xff0c;可以按照如下方式 申请证书 这一步就不详细说了&#xff0c;有免费的和收费的&#xff0c;申请完成之后会给你一个*.pfx结尾的文件。 添加NuGet包 nuget中查找然后再程序中添加引用Micro…

idea

war 发布 war explord 开发

Java最小堆解决TopK问题

转载自 Java最小堆解决TopK问题 TopK问题是指从大量数据&#xff08;源数据&#xff09;中获取最大&#xff08;或最小&#xff09;的K个数据。 TopK问题是个很常见的问题&#xff1a;例如学校要从全校学生中找到成绩最高的500名学生&#xff0c;再例如某搜索引擎要统计每天…

Shiro-概述

一、什么是Shiro shiro是Apache旗下的一个开源框架&#xff0c;将软件系统的安全认证相关功能抽取出来&#xff0c;实现用户身份证&#xff0c;权限授权&#xff0c;加密&#xff0c;会话等功能&#xff0c;组成一个通用的安全认证框架。 二、特点 易于理解的java security …

ASP.NET Core 缓存技术 及 Nginx 缓存配置

前言 在Asp.Net Core Nginx部署一文中&#xff0c;主要是讲述的如何利用Nginx来实现应用程序的部署&#xff0c;使用Nginx来部署主要有两大好处&#xff0c;第一是利用Nginx的负载均衡功能&#xff0c;第二是使用Nginx的反向代理来降低我们后端应用程序的压力。那除了以上两点之…

localStorage、sessionStorage、Cookie的区别及用法

localStorage、sessionStorage、Cookie https://segmentfault.com/a/1190000012057010 localStorage、sessionStorage、Cookie的区别及用法 webstorage webstorage是本地存储&#xff0c;存储在客户端&#xff0c;包括localStorage和sessionStorage。 localStorage localSto…

shiro入门

一、身份认证 基本流程 流程如下&#xff1a; shiro把用户的数据封装成标识token&#xff0c;token一般封装着用户名&#xff0c;密码等信息使用Subject获取到封装着用户的数据标识tokenSubject将token交给SecurityManager&#xff0c;在SecurityManager安全中心中&#xff…

前后端分离开发模式下后端质量的保证 —— 单元测试

概述 在今天&#xff0c; 前后端分离已经是首选的一个开发模式。这对于后端团队来说其实是一个好消息&#xff0c;减轻任务并且更专注。在测试方面&#xff0c;就更加依赖于单元测试对于API以及后端业务逻辑的较验。当然单元测试并非在前后端分离流行之后才有&#xff0c;它很早…