`

Java反射应用示例

 
阅读更多

一、预先需要掌握的知识(java虚拟机)

java虚拟机的方法区:

java虚拟机有一个运行时数据区,这个数据区又被分为方法区,堆区和栈区,我们这里需要了解的主要是方法区。方法区的主要作用是存储被装载的类的类型信息,当java虚拟机装载某个类型的时候,需要类装载器定位相应的class文件,然后将其读入到java虚拟机中,紧接着虚拟机提取class中的类型信息,将这些信息存储到方法区中。这些信息主要包括:

1、这个类型的全限定名

2、这个类型的直接超类的全限定名

3、这个类型是类类型还是接口类型

4、这个类型的访问修饰符

5、任何直接超接口的全限定名的有序列表

6、该类型的常量池

7、字段信息

8、方法信息

9、除了常量以外的所有类变量

10、一个到class类的引用

等等(读者可以参考《深入java虚拟机》这本书的叙述)

Class类:

Class类是一个非常重要的java基础类,每当装载一个新的类型的时候,java虚拟机都会在java堆中创建一个对应于新类型的Class实例,该实例就代表此类型,通过该Class实例我们就可以访问该类型的基本信息。上面说到在方法区中会存储某个被装载类的类型信息,我们就可以通过Class实例来访问这些信息。比如,对于上面说到的信息Class中都有对应的方法,如下:

1、getName();这个类型的全限定名

2、getSuperClass();这个类型的直接超类的全限定名

3、isInterface();这个类型是类类型还是接口类型

4、getTypeParamters();这个类型的访问修饰符

5、getInterfaces();任何直接超接口的全限定名的有序列表

6、getFields();字段信息

7、getMethods();方法信息

等等(读者可以自己参看jdk帮助文档,得到更多的信息)

 

二、java反射详解

反射的概念:所谓的反射就是java语言在运行时拥有一项自观的能力,反射使您的程序代码能够得到装载到JVM中的类的内部信息,允许您执行程序时才得到需要类的内部信息,而不是在编写代码的时候就必须要知道所需类的内部信息,这使反射成为构建灵活的应用的主要工具。

 

反射的常用类和函数:Java反射机制的实现要借助于4个类:Class,Constructor,Field,Method;其中class代表的是类对象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象,通过这四个对象我们可以粗略的看到一个类的各个组成部分。其中最核心的就是Class类,它是实现反射的基础,它包含的方法我们在第一部分已经进行了基本的阐述。应用反射时我们最关心的一般是一个类的构造器、属性和方法,下面我们主要介绍Class类中针对这三个元素的方法:

1、得到构造器的方法

Constructor getConstructor(Class[] params) -- 获得使用特殊的参数类型的公共构造函数,

Constructor[] getConstructors() -- 获得类的所有公共构造函数

Constructor getDeclaredConstructor(Class[] params) -- 获得使用特定参数类型的构造函数(与接入级别无关)

Constructor[] getDeclaredConstructors() -- 获得类的所有构造函数(与接入级别无关)

2、获得字段信息的方法

Field getField(String name) -- 获得命名的公共字段

Field[] getFields() -- 获得类的所有公共字段

Field getDeclaredField(String name) -- 获得类声明的命名的字段

Field[] getDeclaredFields() -- 获得类声明的所有字段
3、获得方法信息的方法

Method getMethod(String name, Class[] params) -- 使用特定的参数类型,获得命名的公共方法

Method[] getMethods() -- 获得类的所有公共方法

Method getDeclaredMethod(String name, Class[] params) -- 使用特写的参数类型,获得类声明的命名的方法

Method[] getDeclaredMethods() -- 获得类声明的所有方法

应用反射的基本步骤:

1、获得你想操作的类的Class对象;

     方法一:Class c=Class.forName("java.lang.String")

     方法二:对于基本数据类型可以用形如Class c=int.class或Class c=Integer.TYPE的语句

     方法三:Class c=MyClass.class

2、调用Class中的方法得到你想得到的信息集合,如调用getDeclaredFields()方法得到类的所有属性;

3、处理第2步中得到的信息,然后进行你想做的实际操作。

 

反射实例:

下面我将针对类的构造器、属性和方法分别举三个例子,向大家演示一下反射的应用过程。

1、构造器

步骤为:通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例

 

package com.test.reflect;

import java.lang.reflect.Constructor;

public class ConstructorDemo { 
	 
	public ConstructorDemo(){  
    }  
    public ConstructorDemo(int a, int b){  
        System.out.println("a="+a+"b="+b);  
    }  
      
    public static void main(String args[]){  
        try {  
            Class cls = Class.forName("com.test.reflect.ConstructorDemo");
         
            System.out.println("class类名称:"+cls.getName());
            Class partypes[] = new Class[2];  
            partypes[0] = Integer.TYPE;  
            partypes[1] = Integer.TYPE;  
              
            Constructor ct= cls.getConstructor(partypes);  
            Constructor[] c=cls.getConstructors();
            Object arglist[] = new Object[2];  
            arglist[0] = new Integer(37);  
            arglist[1] = new Integer(47);  
            Object retobj = ct.newInstance(arglist); 
            System.out.println("特定构造器对象:"+retobj); 
        }  
        catch (Throwable e) {  
            System.err.println(e);  
        }  
    }  

}

 

2、字段属性

步骤为:通过反射机制得到某个类的某个属性,然后改变对应于这个类的某个实例的该属性值

package com.test.reflect;

import java.lang.reflect.Field;


public class FieldDemo {
	public int a=7;
	public int d=9;
	private int b=12;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
	try {
			Class cls=Class.forName("com.test.reflect.FieldDemo");
			//public类型属性
			Field f=cls.getField("a"); 
			System.out.println("特定属性:"+f);
			Field[] fd= cls.getFields();
			System.out.println("所有public类型属性"+fd.length);
			//所有级别属性
			Field fld=cls.getDeclaredField("b");
			System.out.println("private类型属性:"+fld);
			Field[] fldd= cls.getDeclaredFields();
			System.out.println("所有类型属性"+fldd.length);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

3、方法

步骤为:通过反射机制得到某个类的某个方法,然后调用对应于这个类的某个实例的该方法

 

package com.test.reflect;

import java.lang.reflect.Method;

public class MethodDemo {
    public int add(int a, int b){  
        return a + b;  
    }  
	public static void main(String args[]) {

		try {
			Class cls = Class.forName("com.test.reflect.MethodDemo");
			Class partypes[] = new Class[2];
			partypes[0] = Integer.TYPE;
			partypes[1] = Integer.TYPE;

			Method meth = cls.getMethod("add", partypes);
			MethodDemo methobj = new MethodDemo();

			Object arglist[] = new Object[2];
			arglist[0] = new Integer(37);
			arglist[1] = new Integer(47);

			Object retobj = meth.invoke(methobj, arglist);
			Integer retval = (Integer) retobj;
			System.out.println(retval.intValue());
		} catch (Throwable e) {
			System.err.println(e);
		}
	}
}

 

分享到:
评论

相关推荐

    Java反射技术的一般应用

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    JAVA-提高反射效率

    JAVA-反射越来越多的被应用,本代码示例描述了如何提高反射效率

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 ... useArray2.java 用反射机制使用数组示例2 第10章 示例描述:本章学习泛型。 demoBounds.java 演示有界类型 demoForceChange.java 演示强制类型转换 demoGeneric.java ...

    Java反射类中属性方法

    Java反射类中属性方法,简单示例 到高级应用

    Java反射技术的一般应用(放低分数供大家学习)

    在向学生讲解Class.forName()方法的使用时,有时需要扩展讲解为什么这样书写的原理,于是,扩展讲解Java反射技术可以查看被监视类的方法(构造方法和普通方法)、公有属性的功能,以达到封闭功能的效果。该例子使用...

    JAVA反射机制实例教程

    主要介绍了JAVA反射机制,包括了Java反射机制的各种应用技巧,非常具有实用价值,需要的朋友可以参考下

    Java的核心技术反射使用说明

    该例子以使用反射来完成实例化一个JFrame窗体的演示应用,说明Java的反射技术的一般使用。本示例,几乎一行一个注释,非常详细的说明了怎样使用反射,它是学习Java核心技术的非常好的例子。注意:本例子不适合初学...

    【Java】反射机制介绍与Class类的基本能使用(工厂模式)

    Java反射机制与Class类1.Java反射机制1.1 反射机制是什么1.2 反射的应用场合1.3 反射的常用类1.4 反射使用步骤2. Class类2.1 常用方法和示例2.2 获取Class对象的 3 种方法2.3 反射创建对象的 2 种方法3. 工厂设计...

    JAVA Reflection(反射机制)

     反射机制应用示例  简单的Ioc实现  代理模式  Java动态代理  简单的Aop实现  “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,...

    反射机制 上课示例

    获得类名 判断是接口还是类 获得修饰符 final public 获得父类 获得接口 ...应用 给字段赋值 给私有字段赋值 调用无参数无返回值方法 调用有参数有返回值方法 调用构造来创建实例 有非常详细的注释

    基于java语言的数据结构及算法实现,LeetCode算法示例.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    算法图解的算法代码示例,用Python和Java实现,后期会加入其它语言.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    学习数据结构与算法的代码示例,目前提供 Java、Python、Go、C++ 多种语言支持。.zip

    动态性:Java可以通过反射、注解等机制实现在运行时动态加载类和修改行为,增加了程序的灵活性。 综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的...

    Java后端+Java后端中级面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    Java大数据开发+Java大厂面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    Java面试题+Java后端中级面试题

    请解释Java中的反射机制,以及它的用途和局限性。 什么是Java的序列化和反序列化?为什么它们在分布式系统中很重要? 解释什么是Java的设计模式,并列举几个常用的设计模式及其应用场景。 这些题目涵盖了Java开发中...

    Java 基础核心总结 +经典算法大全.rar

    通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK ...

    java基础案例与开发详解案例源码全

    18.5 JDBC应用示例479 18.6 本章习题492 第19章 19.1 网络编程的基本概念494 19.1.1 网络基础知识494 19.1.2 网络基本概念495 19.1.3 网络传输协议496 19.2 Java网络类和接口497 19.3 InetAddress类498 19.4 URL和...

    Java 泛型(Generics)使用说明

    在实际应用中,如果能够灵活应用范型和反射,那么该Java程序员可以设计出非常好的东西来,从而解决实际开发简化开发过程的目的。比如,在EJB 2.0开发客户端应用时,如果使用范型和反射,可以把EJB 2.0的标准使用...

Global site tag (gtag.js) - Google Analytics