【JAVA基础篇】反射

一、反射的概念

是指在运行过程中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的所有方法和属性。这种动态获取信息和动态调用方法的功能称为JAVA的反射机制。

二、反射的优缺点

2.1、优点

通过反射的概念我们已经知道反射的优点是:使程序能够访问到装载到JVM中的类的内部信息(成员变量和成员方法)

2.2、缺点

性能问题:反射是一种解释操作,通过反射来访问字段和调用方法时要慢于直接代码

使用反射会模糊程序内部逻辑:反射绕过了源代码,使用反射后开发人员无法通过查看源代码来判断业务逻辑,会带来维护问题。使用反射往往比直接代码更复杂。

ps:Java反射机制主要应用在对灵活性和扩展性要求很高的系统框架上,普通程序不建议使用。

三、反射的使用

3.1、使用反射API来实例化对象

第一步获取Class实例,有三种方式

Class.forName(是不是很熟悉,JDBC通常通过此方式来获取数据库连接驱动类)

.class

getClass()

第二步使用Class的方法来实例化对象,有两种方式

第一种方式newInstance()

第二种方式

Constructor constructor = clazz.getConstructor();
constructor.newInstance();

话不多说,赶紧上代码

package com.cc.reflect.bean;public class Student
{private int id;private String name;@Overridepublic String toString(){return "Student [id=" + id + ", name=" + name + "]";}
}
package com.cc.reflect;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;import com.cc.reflect.bean.Student;/*** * @描述: 使用反射API来实例化对象* @版权: Copyright (c) 2019 * @作者: 程冲* @版本: 1.0 * @创建日期: 2019年5月17日 * @创建时间: 上午8:35:04*/
public class InstanceStudent
{public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, IllegalArgumentException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException{//1 第一步获取Class实例
//        Class clazz = getClassByFullName("com.cc.reflect.bean.Student");//适用于知道类的完整路径名Class clazz = getClassByName();//适用于编译前就明确要操作的类
//        Student student = new Student();Class clazz = getClassByObject(student);//适用于存在可以操作的实例//2 第二步使用Class的方法来实例化对象
//        Object obj = getInstance1(clazz);//直接通过字节码文件来实例化对象,必须有无参构造器Object obj = getInstance2(clazz);//通过构造对象来实例化对象//3 第三步对象初始化Field fieldId = clazz.getDeclaredField("id");fieldId.setAccessible(true);fieldId.set(obj, 1);Field fieldName = clazz.getDeclaredField("name");fieldName.setAccessible(true);fieldName.set(obj, "张三");//上面的方法破坏了类成员的访问规则,一般不建议这么做System.out.println(obj);}private static Class getClassByFullName(String fullName) throws ClassNotFoundException{return Class.forName(fullName);}private static Class getClassByName(){return Student.class;}private static Class getClassByObject(Object obj){return obj.getClass();}private static Object getInstance1(Class clazz) throws InstantiationException, IllegalAccessException{return clazz.newInstance();}private static Object getInstance2(Class clazz) throws SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{Constructor constructor = clazz.getConstructor();return constructor.newInstance();}
}

ps:本文只介绍了使用反射来实例化对象,有兴趣可以自己去研究一下如何访问类的属性、调用类的方法,比较简单。

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

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

相关文章

在线工具

分享一下很实用的在线工具 在线HTTP接口测试 草料二维码 站长之家

【JAVA基础篇】面对对象的特征

面对对象的3大特征是:封装、继承和多态 封装 封装就是将客观的事物封装成抽象的类,这个类包含这类事物共同的特性和行为,特性对应类的成员变量,行为对应类的成员方法。 封装就是将一批具有相同特性和行为的客观事物封装成抽象类…

【JAVA基础篇】final、finally和finalize

final final表示最终的、不可被更改的,用来修饰类、成员方法和变量,通常处于两方面的考虑来使用它:特殊的设计和效率。 final类 一个类如果确信没有子类或者这个类的方法不允许修改,那么就把这个类定义成final类。 final类的成…

【JAVA基础篇】抽象类和接口的区别

抽象类和接口是定义抽象概念的两种方式,正是由于抽象类和接口,才赋予了Java强大的面向对象的能力。在讨论他们的不同点之前,我们先来了解抽象类和接口。 抽象类 在面向对象的领域一切事物都是对象。对象都是通过类来描述的,但是反…

Oracle常用函数总结

Oracle函数,当任意一个参数为空字符串或者null时,结果返回null 聚合函数 count 使用方式有5种 select count(*) from student;--统计总行数 select count(0) from student;--统计总行数,括号里面的0表示什么意思? select count(id) from …

【JAVA基础篇】==、equals和hashCode的区别和联系

作用:比较两个操作数的关系,返回一个boolean类型的结果 具体含义:如果两个操作数是基本数据类型,比较值是否相等。如果两个操作数是引用类型,那么比较的是内存地址是否相同。 equals Object类的实例方法&#xff0c…

【JAVA基础篇】内部类

定义在一个类内部的类称为内部类。内部类访问权限可以是public、protected、default或private,可以声明为abstract供其他内部类或外部类继承,可以声明为static、final,也可以实现特定的接口。外部类可以访问内部类的所有方法与属性&#xff0…

【JAVA基础篇】访问权限

所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。 四种访问权限 Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四…

Oracle存储过程

什么是存储过程 存储过程是一组为了完成特定功能的SQL语句,经编译后存在数据库,存储过程是数据库中的一个重要对象。 ps:有人说:任何一个设计良好的数据库应用程序都应该用到存储过程,我觉得这个不一定,其实很多互联…

解决debug JDK source无法查看局部变量的问题

首先进入传送门:https://blog.csdn.net/majian_1987/article/details/51273609 进行上面的操作之后,这个时候我们来debug一下jdk源码,发现可以查看局部变量。但是这时候又发现一个问题,在我自己的代码里按住ctrl鼠标左键单击无法…

【JAVA基础篇】多线程

学习Java的多线程知识之前,我们先来了解一下进程和线程的概念,以及他们之间的关系。 进程 基本概念 进程是具有独立功能的程序在某个数据集合上的一次执行过程。 特点 进程是操作系统进行资源分配的基本单位。每个进程都有自己的地址空间&#xff0…

配置JAVA开发环境

1、首先去Oracle官方网站下载所需版本的JDKhttp://java.sun.com/products/archive/,然后安装,其实只需要安装jdk就可以了,不需要安装jre 2、按照后配置环境变量JAVA_HOME 然后在path最前面添加%JAVA_HOME%\bin; 3、cmd中输入java -version,提…

【JAVA基础篇】枚举

/*** 一组相同类型的常量的集合* author cc**/ public class EnumDemo {public static void main(String[] args) {//遍历for(WorkDay workDay:WorkDay.values()){System.out.println("序号:"workDay.ordinal());//ordinal,返回枚举常量的序号…

【JAVA基础篇】集合框架

一、集合框架图 Java集合框架主要包含两种类型的容器,一是集合(Collection),存储元素集合,二是图(Map),存储键(key)-值(value)对.Collection接口下面有两个重要的子接口List和Set,再下面是一些抽象类,最后是…

【JAVA基础篇】对象初始化过程

我们都知道,创建对象是由 new关键字调用构造方法 返回类实例(实际上还可以通过反射来创建实例)。 例如 : Person jack new Person(); 这句话到底做了什么事情呢 ? 其实就是讲对象的初始化过程。 1、 new 用到了Person.class,所…

【Java基础篇】try catch finally语句包含return语句时的执行过程

网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行? 很多人都说不是,当然他们的回答是正确的,经过我试验,至少有两种情况下finally语句是不会被 try语句没有被执行到,如在…

eclipse指定JDK版本启动,解决version XXX of the JVM is not suitable for this product.Version:XXX 问题

问题描述:启动eclipse时,提示version 1.7.0 of the JVM is not suitable for this product.Version:1.8 or greater is required. 原因分析:原因是我的笔记本安装了多个JDK版本,但是现在我的JAVA_HOME配置的是jdk1.7的路径&#x…

【JAVA基础篇】Socket编程

一、Socket的概念 Socket是一种通讯机制,通常称为套接字。英文原意是插座,顾明思义,Socket像是一个多孔插座,可以提供多个端口的连接服务 ps:至于socket在计算机术语中怎么就翻译成了“套接字”这个令人费解的词,这真…

【JAVA基础篇】注解

一、什么是注解? 注解是元数据,所谓元数据就是描述数据的数据。 在annotation诞生之前(jdk1.5诞生了注解),甚至之后,xml被广泛的由于描述元数据。但是后来,有一些应用开发工程师和架构师觉得它…

【JAVA基础篇】IO流

一、流的概念 “对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。” ――《Think in Java》 无论是系统、还是语言的设计中IO的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素,我们不仅仅要考虑文件、…