浅谈Java的反射机制

Java的反射机制特别适合大型项目尤其是多功能项目的开发。因为它极大的减少了编译时静态加载类的时间并且减少了初期内存的消耗。

为什么要有反射机制

1.    在涉及某些应用程序时,我们往往需要动态升级以增加修改功能,而在静态编译体系中一切升级操作都需要对源代码进行更改,这就意味着每升一次级就要对整个源代码编译一次。小程序编译还好说,但如果是大型程序的话,编译一次要几个小时甚至几天才能完成,那这样显然纯静态的编程方式不太适合。而Java也是一门静态语言,为了弥补这个缺点,就有了反射机制。

2.    Java更多的情况是应用于服务端程序,而服务器上的程序有个很重要的特点就是不能关掉;即使关掉,也要提前给用户通知。那么,如果此时要对系统进行升级,既要保证体系内其他功能正常运行,还要保证升级措施,此时就可以用反射来实现。

3.    使程序更加清晰,将主程序和功能程序分离开,便于后期管理。

反射机制的应用

•      杀毒软件病毒库的在线升级

•      JDBC数据桥的构建(Class.forName(“数据库驱动包类名称”))

•      应用程序功能的增加

•      分析泛型的实质

•      分析程序,找bug

反射机制有三种实现方式

•      得到类类型,同时加载类Class class = Class.forName(“SomethingName”)

•      已知类对象,由对象得到其所属类Class class = new Demo().getClass()

•      直接由类得到其类类型Class class = Demo.Class

反射的类

•      Class类,用来处理类级别的反射;

•      Field类,用来处理成员变量级的反射;

•      Method类,用来处理方法级反射的类;

•      Constructor类,用来处理构造器反射的类;

反射的小例子(以管理系统为例)

import java.lang.reflect.Method;

import java.util.Scanner;

class Main {

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void main(String[] args) {

System.out.println("||Add||   ||Remove||   ||Sort||   ||Change||   ||Seek||");

System.out.print("Input your choose:");

Scanner scanner = new Scanner(System.in);

String string = scanner.nextLine();

scanner.close();

try{

Class class1 = Class.forName(string);     //得到类同时加载类

Method method = class1.getDeclaredMethod("command", String.class);

method.invoke(class1.newInstance(), "something");

}

catch(Exception e){

e.printStackTrace();

}

}

}

class Add implements Common{

public void command(String string){

System.out.println("Add Completed!");

}

}

class Remove implements Common{

public void command(String string){

System.out.println("Remove completed!");

}

}

class Sort implements Common{

public void command(String string){

System.out.println("Sort completed!");

}

}

class Change implements Common{

public void command(String string){

System.out.println("Change completed!");

}

}

class Seek implements Common{

public void command(String string){

System.out.println("Seek completed!");

}

}

interface Common {

public void command(String string);

}

透过反射看泛型

Java中的泛型本质作用是为了防止编译阶段的输入错误、类型引用错误、参数错误。而在编译之后,Java中就不存在泛型的概念了。这里,可以用反射加以验证。

import java.lang.reflect.Method;

import java.util.ArrayList;

public class Test {

@SuppressWarnings({ "rawtypes", "unchecked" })

public static void main(String[] args){

ArrayList<String> arrayList = new ArrayList<String>();

arrayList.add("string");

System.out.println(arrayList.size());

Class class1 = arrayList.getClass();

try {

Method method = class1.getMethod("add", Object.class);

method.invoke(arrayList, 100);

System.out.println(arrayList.size());

}

catch (Exception e){

e.printStackTrace();

}

ArrayList arrayList2 = new ArrayList();

Class class2 = arrayList2.getClass();

System.out.println(class1 == class2);

}

}

结果显示为1、2、true,这就表明通过反射,int类型的值被成功添加到最初泛型为String的集合当中,而最后的true也表示编译后两个集合类类型是相同的,不存在泛型。

原文地址:https://www.cnblogs.com/fusiji/p/11409839.html

时间: 2024-08-28 00:47:27

浅谈Java的反射机制的相关文章

java的反射机制

一.java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动,说不定会请各位吃饭哦! 1.何谓反射机制 根据网文,java中的反射机制可以如此定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2.反射

浅谈 Java Printing

浅谈 Java  Printing 其实怎么说呢?在写这篇博文之前,我对java printing 可以说是一无所知的.以至于我在敲文字时, 基本上是看着api文档翻译过来的.这虽然看起来非常的吃力,但是我相信,有道大哥不会辜负我的.嘻 嘻! Java Printing 技术,也就是我们平时所接触的打印,只不过是说可以用Java实现而已. 一.Java Printing 打印简介 Java Printing API能够使java应用程序实现相关的打印功能,如: 1.打印所有 Java 2D 和

浅谈java异常[Exception]

本文转自:focusJ 一. 异常的定义 在<java编程思想>中这样定义 异常:阻止当前方法或作用域继续执行的问题.虽然java中有异常处理机制,但是要明确一点,决不应该用"正常"的态度来看待异常.绝对一点说异常就是某种意义上的错误,就是问题,它可能会导致程序失败.之所以java要提出异常处理机制,就是要告诉开发人员,你的程序出现了不正常的情况,请注意. 记得当初学习java的时候,异常总是搞不太清楚,不知道这个异常是什么意思,为什么会有这个机制?但是随着知识的积累逐渐也

浅谈Java锁

每当遇到Java面试,"锁"是个必然会被提到的东西.那么,在面试中,谈"锁"都会谈论些什么呢,诸位看官又是否对"锁"有足够的了解? 本文旨在剖析锁的底层原理,以及锁的应用场景. 一.Synchronized 1.一道面试题 同一个对象在A.B两个线程中分别访问该对象的两个同步方法writer和reader,是否会产生互斥? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别(转)

一.Java的反射机制   每个Java程序执行前都必须经过编译.加载.连接.和初始化这几个阶段,后三个阶段如下图:  其中 i.加载是指将编译后的java类文件(也就是.class文件)中的二进制数据读入内存,并将其放在运行时数据区的方法区内,然后再堆区创建一个Java.lang.Class对象,用来封装类在方法区的数据结构.即加载后最终得到的是Class对象,并且更加值得注意的是:该Java.lang.Class对象是单实例的,无论这个类创建了多少个对象,他的Class对象时唯一的!!!!.

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

Java 中反射机制的深入研究

昨天学习了java的反射机制,今天继续深入学习一下. 一.通过反射操作数组 反射不光只能用在类中,也可用在任意的引用数据类型上.当然包括数组. 通过java.lang.reflect.Array 类 可操作数组,java.lang.reflect.Array 类 下面提供了很多方法. 例如 public static Object get(Object array,int index)throws IllegalArgumentException,ArrayIndexOutOfBoundsExc

Java 类反射机制分析

一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection.(大家看到这个单词,第一个想法应该就是去开发文档中搜一下了.)它允许运行中的Java程序对自身进行检查,并能直接操作程序的内部属性或方法.Reflection机制

浅谈Java虚拟机

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. 浅谈Java虚拟机,布布扣,bubuko.com