java 反射的弊端_java反射机制的一些学习心得小结

2fdcc75eeeb0c8fcc46132fa9f53b255.png

概述

之前在了解Spring的类加载机制的时候,了解了java的反射机制。但是,我对反射理解一直不深。也一直有点疑惑:Spring为什么利用反射创建对象?直接new对象和依靠反射创建对象有什么区别?什么是动态加载类?

什么是反射?

要想知道反射到底是什么,首先需要知道java的类加载和对象创建的机制。

当我们写完一个java文件的时候,后缀是.java。在我们利用IDE执行java文件的时候,其实IDE也帮我们运行了javac,即java编译器。编译器会将.java文件编译成.class文件。java虚拟机会去读取.class文件。这时候,类加载器ClassLoader会将这些类,以及该java文件import的类加载到JVM中的方法区。这些被加载的类的类型都是Class,习惯称之为类对象。

对象的创建,即是根据这些Class类对象,在堆区创建对象。

这时候,反射就很好理解了。反射的目的就是获取这些Class类对象

反射的方式

目前我知道可以利用反射返回类对象的方式有四种:

1.如果你知道类的路径:

Class aclass = Class.forName("类的路径"); //如java.util.ArrayList,你就可以获得ArrayList的类对象

2.如果你知道类:

Class aclass = ArrayList.class;

3.如果你实例化对象:

ArrayList array = new ArrayList();

Class aclass = array.getClass();

4.通过类加载器加载(个人不经常用忘记了hhh)

类对象Class的用法

获得Class类对象,我们可以非常轻松的获取到该类的字段和方法,我们甚至可以得到该类的父类:如:getMethod,getConstructor... 就是获取类对象的方法,构造器等等,这些可以去网上查到相应的资料,这里不做赘述。

我们得到了Class类对象,我们就可以利用Class类对象创建一个对象实例了!这里就是工厂模式的利用方法,将所有类创建的工作交给工厂类实现,并将创建的对象返回即可。这样就能方便管理对象创建的工作。利用反射,创建对象的例子:

//利用反射机制创建一个ArrayList的对象

Class aclass = Class.forName("java.util.ArrayList"); //依靠反射,获取ArrayList的类对象

ArrayList array = (ArrayList)aclass.newInstance(); //利用Class类对象,创建ArrayList类

什么是动态加载?

之前我也不知道什么是静态加载,什么是动态加载,看了一个人的博客豁然开朗:点击连接

他说的很清楚了:java中的new方法是静态加载,因为new方法是在编译阶段就会检查,而不是在运行阶段。反射是可以在运行时创建对象,调用对象的方法、变量等。

该博客作者利用了两个例子进行诠释

静态加载:

//定义接口

interface OfficeAble{

public void start();

}

//Main

class Office{

public static void main(String[] args){

if(args[0].equals("Word")){

Word w = new Word();

w.start();

}

if(args[0].equals("Excel")){

Excel e = new Excel();

e.start();

}

}

//Word类

class Word implements officeAble{

public void start(){

System.out.println("Word Start");

}

这样会报错。静态加载会在编译阶段将Class类对象加载进方法区,因为这里没有定义Excel类,编译器就会报错。

动态加载:

//接口和Word类同上,修改一下Main方法

class Office{

public static void main(String[] args){

try{

Class c = Class.forName(args[0]);

OfficeAble oa = (OfficeAble)c.newInstance();

oa.start();

}

catch(Exception e){

e.printStackTrace();

}

}

这样就能成功运行,利用反射,只要知道接口,能很好的提高扩展性!不管写多少个类,只要继承接口,都可调用。

总结

到此这篇关于java反射机制的一些学习心得的文章就介绍到这了,更多相关java反射机制内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

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

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

相关文章

llog

/Files/TNTZWC/zxLog.rar转载于:https://www.cnblogs.com/TNTZWC/archive/2010/07/13/1776437.html

LeetCode 1015. 可被 K 整除的最小整数(数学)

1. 题目 给定正整数 K,你需要找出可以被 K 整除的、仅包含数字 1 的最小正整数 N。 返回 N 的长度。如果不存在这样的 N,就返回 -1。 示例 1: 输入:1 输出:1 解释:最小的答案是 N 1,其长度为…

网站公告js

<html><head><meta http-equiv"Content-Language" content"zh-cn"><meta http-equiv"Content-Type" content"text/html; charsetgb2312"><title>网站公告滚动</title></head><body> …

LeetCode 923. 三数之和的多种可能(双指针)

1. 题目 给定一个整数数组 A&#xff0c;以及一个整数 target 作为目标值&#xff0c;返回满足 i < j < k 且 A[i] A[j] A[k] target 的元组 i, j, k 的数量。 由于结果会非常大&#xff0c;请返回 结果除以 10^9 7 的余数。 示例 1&#xff1a; 输入&#xff1a;…

Java用sqlit拆分小数_如何将SQLite列中的分隔值拆分为多列

拉开一列是为Python非常简单(不确定关于SQLite)。这将您的DB行简化为一个字符串数组&#xff0c;并且应该与SQLite返回类似。text [Apple,Banana, Pear,Lemon, Peach, Apricot]for line in text:cols [c.strip() for c in line.split(,)]print(cols)应该输出每串线阵列&#…

Flex读取XML不刷新问题

Flex读取servlet提供的xml数据&#xff0c;有更新功能。数据更新后&#xff0c;Firefox下完全正常&#xff0c;IE下死活刷新不出新数据。郁闷呢了好长时间&#xff0c;以为是资源释放的问题。整整高了将近两个小时。没搞定&#xff0c;只能请教头了。问题描述完&#xff0c;头问…

java程序语言228_2019年Java面试题基础系列228道(5)

21、存在两个类&#xff0c;B 继承 A&#xff0c;C 继承 B&#xff0c;我们能将 B 转换为C 么&#xff1f;如 C (C) B&#xff1b;这属于强制类型转换&#xff0c;如果被转换的B实例不是C类型&#xff0c;会有异常比如你的ABC分别对应动物&#xff0c;猫&#xff0c;黑猫。向上…

LeetCode 1442. 形成两个异或相等数组的三元组数目(前缀异或)

1. 题目 给你一个整数数组 arr 。 现需要从数组中取三个下标 i、j 和 k &#xff0c;其中 (0 < i < j < k < arr.length) 。 a 和 b 定义如下&#xff1a; a arr[i] ^ arr[i 1] ^ ... ^ arr[j - 1]b arr[j] ^ arr[j 1] ^ ... ^ arr[k] 注意&#xff1a;^ 表…

解决锚点在IE8中失效

锚点功能在网站制作过程中是经常会用到的&#xff0c;而且是一个非常好用的功能。 今天遇到这样一个问题刚刚做好的静态页面使用到了锚点&#xff0c;用IE8打开却失效了。尝试用火狐&#xff0c;360浏览器打开却没问题。很明显这是浏览器的兼容性问题。 解决办法…

java jsoup获取cookie_java – 如何使用jsoup维护变量cookie和会话?

这段代码非常令人困惑.流程不合逻辑,异常处理很糟糕.像if(p&#xff01; path)和if(cookys&#xff01; cookies)之类的对象引用比较没有任何意义.要比较对象的内容,您需要使用equals()方法.到目前为止,我知道您希望在同一个域上的一堆后续Jsoup请求中维护cookie.在这种情况下,…

LeetCode 1443. 收集树上所有苹果的最少时间(自底向上DFS)

1. 题目 给你一棵有 n 个节点的无向树&#xff0c;节点编号为 0 到 n-1 &#xff0c;它们中有一些节点有苹果。 通过树上的一条边&#xff0c;需要花费 1 秒钟。 你从 节点 0 出发&#xff0c;请你返回最少需要多少秒&#xff0c;可以收集到所有苹果&#xff0c;并回到节点 0 …

利用多线程句柄设置鼠标忙碌状态

当我们在读取数据的时候&#xff0c;或者处理大量数据的时候可能需要把鼠标设置为忙碌状态&#xff0c;等待返回结果。下面的代码可以帮忙实现这点&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Syste…

java怎吗从磁盘读文件_编写一个Java应用程序,该程序使用FileInputStream类,实现从磁盘读取本应用程序源代码文件,并将文件内容显示在屏幕上。...

满意答案x786741812013.05.10采纳率&#xff1a;42% 等级&#xff1a;12已帮助&#xff1a;14476人import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.BufferedReader;import java.io.IOException;import java.io.FileNotFoundException;pub…

漂亮的博客搜索框

看到漂亮的搜索框&#xff0c;收藏... 主要用背景图片和输入框和链接隐藏完成。 可以在IE6,ff&#xff0c;chorme下兼容... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo…

LeetCode 518. 零钱兑换 II(动态规划)

1. 题目 给定不同面额的硬币和一个总金额。 写出函数来计算可以凑成总金额的硬币组合数。 假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111示例 2: 输入: amount 3, coins [2] 输…

编写Web前端代码的注意事项

1. 最好在html标签之前添加一句类似于 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > 的代码&#xff0c;该代码表示遵循W3C的某一套标准&#xff0c;具体使用哪套标准因人而异。 使用…

LeetCode 863. 二叉树中所有距离为 K 的结点(公共祖先/ DFS+BFS)

文章目录1. 题目2. 解题2.1 公共祖先2.2 建图BFS1. 题目 给定一个二叉树&#xff08;具有根结点 root&#xff09;&#xff0c; 一个目标结点 target &#xff0c;和一个整数值 K 。 返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。 示例 …

ioctl操作

ioctl操作传统上ioctl函数是用于那些普遍使用&#xff0c;但不适合归入其他类别的任何特性的系统接 口。Posix去掉了ioctl&#xff0c;它通过创建特殊的其功能已被Posix标准化的包裹函数来代替ioctl。这一章介绍和网络 编程有关的ioctl操作。1. ioctl函数int ioctl(int d, int …

java用栈处理四则运算_Java 用栈处理四则运算

import java.util.Arrays;import java.util.HashMap;import java.util.Map;import java.util.Stack;import java.util.regex.Matcher;import java.util.regex.Pattern;/*** 目前只能做简单的四则运算&#xff0c;不支持浮点数和其他符号&#xff0c;不支持多线程* 计算步骤&…