`

Java反射常用机制

    博客分类:
  • Java
 
阅读更多

首先要求大家对Java泛型知识有所了解,因为程序代码中大量使用了泛型相关知识。

 

  • 动态语言与反射
“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。尽管在这样的定义与分类下Java不是动态语言,它却有着一个非常突出的动态相关机制:Reflection。
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
  • Java反射的典型应用
Spring框架:IOC(控制反转)、白盒测试、Hibernate框架:关联映射等
  • Java反射常用的对象
java.lang包下Class<T>:表示一个正在运行的 Java 应用程序中的类和接口,是Reflection的起源;
java.lang.reflect包下Field 类:代表类的成员变量(也称类的属性)、Method类:代表类的方法、Constructor 类:代表类的构造方法、Array类:提供了动态创建数组,以及访问数组的元素的静态方法。
 
  • Class<T>

 

类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类,就会产生一个Class对象。

Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对象。

Class是Reflection起源。要想操纵类中的属性和方法,都必须从获取Class object开始。

 

第一个实例就用大家非常熟悉的ArrayList类,我们尝试来获取ArrayList申明的方法。

 

public static void main(String[] args) {
	ArrayList aList = new ArrayList(); 
	Class alClass = aList.getClass();
	System.out.println("①"+alClass);
	System.out.println("②"+alClass.getName());
	Method[] alMethod = alClass.getDeclaredMethods();
	for(Method method : alMethod){
		System.out.println("③"+method);
		System.out.println("④"+method.getName());
	}
}

 

 


 

 

 

 

获取Class对象的方法
获取方法 说明 示例
object.getClass()每个对象都有此方法 获取指定对象的Class

List list = new ArrayList();

Class listClass = list.getClass();

class. getSuperclass() 获取当前Class的继承类Class

List list = new ArrayList();

Class listClass = list.getClass();

Class superClass = listClass. getSuperclass();

Object.class .class直接获取 Class listClass = ArrayList.class;
Class.forName(类名) 用Class的静态方法,传入类的全称即可 Class c = Class.forName("java.util.ArrayList");
Primitive.TYPE 基本数据类型的封装类获取Class的方式

Class longClass = Long.TYPE;

Class integerClass = Integer.TYPE;

Class voidClass = Void.TYPE;

 

 
平常情况我们通过new Object来生成一个类的实例,但有时候我们没法直接new,只能通过反射动态生成。
实例化无参构造函数的对象,两种方式:
Class. newInstance();
Class. getConstructor (new Class[]{}).newInstance(new Object[]{})
 实例化带参构造函数的对象:
clazz. getConstructor(Class<?>... parameterTypes) . newInstance(Object... initargs) 
 
首先我们新建一个JavaBean—User,User继承自另一个Bean—BaseUser。注意:这两个Bean的属性和方法的作用域!



 
 下面看代码实例:


 
 
  • Method对象--反射方法
获得当前类以及超类的public Method:
Method[] arrMethods = classType. getMethods();
 
获得当前类申明的所有Method:
Method[] arrMethods = classType. getDeclaredMethods();
 
获得当前类以及超类指定的public Method:
Method method = classType. getMethod(String name, Class<?>... parameterTypes);
 
获得当前类申明的指定的Method:
Method method = classType. getDeclaredMethod(String name, Class<?>... parameterTypes) ;
 
通过反射动态运行指定Method:
Object obj = method. invoke(Object obj, Object... args);
 
下面看代码实例:


 


 

 
  • Field 对象--反射属性
获得当前类以及超类的public Field:
Field[] arrFields = classType. getFields();
 
获得当前类申明的所有Field:
Field[] arrFields = classType. getDeclaredFields();
 
获得当前类以及超类指定的public Field:
Field field = classType. getField(String name);
 
获得当前类申明的指定的Field:
Field field = classType. getDeclaredField(String name); 
 
通过反射动态设定Field的值:
fieldType.set(Object obj, Object value);
 
通过反射动态获取Field的值: 
Object obj = fieldType. get(Object obj) ;
 
 
下面是具体的代码实例:


 


 

 
  • Spring框架的IOC的简化实现


 


 

 

  • Java反射总结

只要用到反射,先获得Class Object

 

没有方法能获得当前类的超类的private方法和属性,你必须通过getSuperclass()找到超类以后再去尝试获得

 

通常情况即使是当前类,private属性或方法也是不能访问的,你需要设置setAccessible(true)(取消访问安全校验)来取得private的访问权。根据《编写高质量代码:改善Java程序的151个建议》书中介绍,除非一定要控制private安全访问,否则反射时都取消Java的安全访问校验(即设置setAccessible(true)),这样能提高反射性能。

 

Array对象并未讲解,请下来自己学习

  • 大小: 61.9 KB
  • 大小: 9.8 KB
  • 大小: 20.7 KB
  • 大小: 99.5 KB
  • 大小: 70.2 KB
  • 大小: 108 KB
  • 大小: 50.2 KB
  • 大小: 32.4 KB
  • 大小: 81.8 KB
  • 大小: 10 KB
1
1
分享到:
评论
3 楼 xjlcao 2013-01-05  
想请教一下,如果BaseUser类里面有ArrayList属性呢,该怎么反射呢?
2 楼 白糖_ 2012-08-06  
sweat89 写道
设置压制权限setAccessible(true)来取得 private的访问权?
楼主能具体讲解下怎么获取private修饰的方法么


用getDeclaredMethod就可以获取当前类的private方法了,然后再setAccessible(true)就可以调用运行该方法
Method method = classType. getDeclaredMethod(String name, Class<?>... parameterTypes) ;
1 楼 sweat89 2012-08-05  
设置压制权限setAccessible(true)来取得 private的访问权?
楼主能具体讲解下怎么获取private修饰的方法么

相关推荐

    反射实例-JAVA反射机制

    ### 反射实例—JAVA反射机制 #### 一、反射概念及原理 反射在计算机科学领域,特别是程序设计中,是指程序有能力访问、检测和修改其自身的结构和行为。这一概念最早由Smith于1982年提出,并迅速应用于各种编程语言...

    java反射机制 字符串——java对象

    Java反射机制是Java语言提供的一种强大功能,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类是`java.lang.Class`,它代表了运行时的类信息。通过Class对象,我们...

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

    总之,Java反射机制为开发者提供了极大的灵活性,能够在运行时探索和操作类的内部细节,从而实现高度动态的程序设计。然而,过度使用反射可能会降低代码可读性和性能,因此应当权衡利弊,合理运用。

    Java 反射常用方法及实例.pdf

    Java 反射机制详解 Java 反射机制是 Java 语言提供的一个重要功能,可以在运行时检查类、接口、方法和变量等信息,无需知道类的名字、方法名等。通过反射机制,可以在运行时实例化新对象、调用方法、设置和获取...

    Java反射机制概述.pdf

    ### Java反射机制概述 Java反射机制是指Java程序在运行时,可以动态地获取一个类的信息以及调用其方法的机制。这是Java语言的一个重要特性,允许程序在运行时检查和修改类的行为。 #### 反射机制的基本操作 在...

    java反射机制的原理及在Android下的简单应用

    ### Java反射机制的原理及在Android下的简单应用 #### 一、Java反射机制的基本概念 反射(Reflection)是指程序在运行时能够访问、检测和修改它自身的能力。这种能力使得程序能够动态地获取自身的结构信息并操作...

    Java语言的反射机制.pdf

    Java反射机制是一种非常强大的机制,它提供了一种在运行期获得类信息并构建类的Class对象和生成类实例的机制。它的应用非常广泛,包括动态代理、AOP、依赖注入等。但是,它也存在一些缺点,如性能问题和安全问题。

    java中的常用反射机制详细分析案例

    下面我们将深入探讨Java反射机制的核心概念、常见用法及其在实际开发中的应用。 1. **核心概念** - **类的Class对象**:每个Java类在内存中都有一个对应的Class对象,它包含了该类的所有信息,如类名、方法、字段...

    java反射机制学习(五):工厂模式

    Java反射机制是Java语言提供的一种强大的能力,它允许在运行时检查类、接口、字段和方法的信息,并且能够动态地创建对象和调用方法。在本篇“java反射机制学习(五):工厂模式”中,我们将探讨如何利用反射与工厂模式...

    Java反射机制

    ### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它使得Java能够在运行时动态地获取类的信息,并且能够动态地调用类的方法和属性。这一特性极大地增强了Java语言的灵活性...

    Java反射机制 深入浅出

    ### Java反射机制深入浅出 #### 一、什么是反射? 反射是Java中一项非常重要的特性,它允许程序在运行时动态地获取类的信息,并且能够直接操作这些信息。通俗来说,反射就像是为Java对象装上了一面镜子,通过这面...

    类的反射机制 常用的方法(简单明确)

    ### 类的反射机制及其常用方法 #### 反射机制简介 反射是Java语言的一个重要特性,它允许在运行时检查类、接口、字段和方法的信息,并且可以动态地调用方法或修改字段值。这种能力使得Java程序具有高度的灵活性和...

    java反射详解

    ### Java反射机制详解 #### 一、引言 Java反射机制是Java编程语言的一个核心特性,它允许程序在运行时动态地访问类的信息,并能够直接操作这些类的对象。这种能力对于许多开发框架(如Spring)来说至关重要,因为...

    Java安全漫谈 - 01.反射篇(1)1

    Class.forName() 方法是 Java 反射机制中的一种常用方法,用于加载类。但是,这个方法也存在安全隐患。攻击者可以使用这个方法来加载恶意类,导致系统受到攻击。 安全编码实践 为了避免反射机制的安全隐患,需要...

    java中的反射机制

    ### Java中的反射机制 #### 一、引言 在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时动态地检查和修改自身的行为。这种能力对于实现框架、工具以及需要运行时动态行为的应用程序尤为...

Global site tag (gtag.js) - Google Analytics