`

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 反射原理示例

    以下是对这个“最简单Java反射原理示例”的详细解释。 一、Java反射的概念 Java反射机制允许我们在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。这是通过`java.lang.Class`类和相关API...

    java反射示例代码

    Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在Java中,反射主要用于以下场景:代码生成、元数据访问、插件系统、框架设计等。...

    Java反射示例代码.rar

    Java反射是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。...提供的"Java反射示例代码.rar"资源正好可以帮助初学者通过实践来理解这些概念。

    java反射源码示例+注释详细

    Java反射的应用非常广泛,比如在插件系统、框架开发、序列化和反序列化、动态代理等场景中都有所体现。然而,由于反射打破了封装性,滥用反射可能会导致安全问题,如暴露私有信息,因此在使用时需谨慎。 总之,Java...

    java 反射ppt 和 code 示例

    9. **应用示例**:可能包括动态代理、配置文件驱动的代码、插件系统等实际应用场景。 接下来,代码示例部分可能会包含以下内容: 1. **反射实例化对象**:演示如何通过反射创建一个类的新实例,即使该类的构造器是...

    Java反射技术的一般应用

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

    JAVA 反射PPT的示例代码

    通过这些示例,你可以深入理解Java反射的各个方面,并将其应用到你的项目中。 总结起来,Java反射是一个强大的工具,它提供了程序在运行时检查和操作类的能力。通过学习和实践PPT中的示例代码,开发者可以更好地...

    java反射机制+代码示例

    Java反射机制是Java编程语言中...通过实际的代码示例,学习和理解Java反射机制将变得更加直观和深入。在实际开发中,反射常用于框架、插件系统、序列化/反序列化、测试等方面,但也需要谨慎使用,避免过度依赖和滥用。

    java反射 java反射 java反射java反射

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。在Java中,反射机制提供了强大的能力,包括在运行时检查类的结构、创建对象实例、调用方法以及访问和修改字段值。...

    java反射机制应用

    #### 二、Java反射机制的应用场景及示例 ##### 1. 判断一个类是否是某个类的实例或子类 ```java Class<?> cls = Class.forName("com.example.Jdk"); boolean isInstance = cls.isInstance(new Jdk()); System.out....

    java反射实例代码

    在提供的"java反射实例代码"中,应该包含了如何使用上述方法的实际示例,这些示例有助于加深对Java反射机制的理解。通过阅读和运行这些代码,开发者可以更直观地学习如何在程序运行时动态地操作类、方法和字段,从而...

    Java反射性能测试分析

    - [Oracle官方文档](https://docs.oracle.com/javase/tutorial/reflect/):提供关于Java反射机制的详细解释和示例。 - [Effective Java](https://www.amazon.com/Effective-Java-3rd-Edition/dp/0134685997):由...

    Java反射机制总结

    - **运行时装配**:Java反射允许程序在运行时动态地加载类和创建对象,这对于构建可扩展的应用程序非常有用。 - **元数据查询**:开发人员可以利用反射来查询类的元数据,如字段名、方法签名等。 - **动态调用方法**...

    java面试题--反射机制

    通过本文,我们将深入探讨Java反射机制的核心概念、基本原理及其应用场景。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时获取类的信息,这使得Java具有了一定程度上的动态性。具体来说,Java反射机制...

    java类反射示例源码

    通过这个示例源码,开发者可以更深入地理解Java反射机制,这对于理解和调试代码、编写动态工具或者实现元编程等高级功能非常有帮助。同时,反射虽然强大,但应谨慎使用,因为它可能导致安全问题和性能下降,例如绕过...

    JAVA反射示例

    Java反射是Java编程语言中的一个重要特性,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个特性为Java提供了强大的元数据访问能力,使得代码更加灵活,适用于...

    反射实例-JAVA反射机制

    下面通过一个简单的示例来展示Java反射机制的工作流程: ```java import java.lang.reflect.*; public class DumpMethods { public static void main(String args[]) { try { Class c = Class.forName(args[0])...

    Java反射经典实例

    在提供的"Java反射经典实例.htm"文件中,可能会包含具体的代码示例,演示如何使用反射创建对象、访问字段、调用方法等。结合文件中的内容,读者可以更深入理解反射的实际应用。 总结,Java反射机制提供了对运行时类...

    Java方法反射调用demo

    本示例将深入探讨如何使用Java反射进行各种方法的调用。 首先,让我们从调用无参数的方法开始。在Java中,我们可以通过`Class`对象的`getMethod`方法获取到指定的公共方法,然后通过`invoke`方法调用它。例如: ``...

    Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作.docx

    在实际开发中,Java反射JavaBean对象自动生成插入、更新、删除、查询sql语句操作可以广泛应用于各种基于Java的应用程序中,例如Web应用程序、桌面应用程序、移动应用程序等。这种技术可以大大提高开发效率,减少开发...

Global site tag (gtag.js) - Google Analytics