`
xifangyuhui
  • 浏览: 188992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java反射笔记(2)

阅读更多

java.lang.array提供了动态创建和当问数组元素的各种静态方法。

public class ArrayTest2 {
/*
 * 动态创建一个5X10X15的三维数组并且设置[3][5][10]位置的值
 */
	public static void main(String[] args) {
		//设置维数数组,即将数组的维数存到一个数组中
		int[] dims = new int[]{5, 10, 15};
		//利用Array的静态方法newInstance传递数组中元素的Class类型以及维数数组动态生成一个数组对象
		Object array = Array.newInstance(Integer.TYPE, dims);
		//多维数组大家都知道,即数组的数组的数组的...这里是三维数组,取出数组中3这个索引的值其实是一个二维数组
		Object arrayObj = Array.get(array, 3);
		//得到该二维数组的类型
		Class cls = arrayObj.getClass().getComponentType();
		//继续得到二维数组中索引5对应的一维数组
		arrayObj = Array.get(arrayObj, 5);
		//设置该一维数组中索引10的位置的值为120
		Array.set(arrayObj, 10, 120);
		//将Object类型的数组对象array强制转化为int[][][]
		int[][][] intArray = (int[][][]) array;
		System.out.println(intArray[3][5][10]);
	}
}
 

为一个class生成对应的Class对象:



 

如果要生成对象实体 ,在反射动态机制中有两种方法,一个针对”无自变量构造方法“,另外一个针对”带参数的构造方法“,如果调用的是”带参数构造方法“需要调用Constructor对象的newInstance(),并且需要首先准备一个Class[]作为Constructor的参数类型,然后以此为自变量调用getConstructor(),获得一个专属的Construtor,再调用该Construtor的newInstance()。如果调用无自变量的构造方法,直接调用Class的newInstance()就可以。


运行时调用Method:和动态调用带参数的构造方法类似,首先需要准备一个Class[]作为参数类型,接着以此为自变量调用getMethod(),获得特定的Metho0d Object。接下来准备一个Object[]放置自变量,调用上面得到Method对象的invoke方法。

那么为什么获得Method Object时不需要指定返回类型呢?

因为Method overloading机制要求signature必须唯一,而返回类型并非signature的一个成分。换句话说,只要制定了method名称和参数列,就一定指出了一个独一无二的method。

代码:

 

和调用某个特定构造方法构造类的实例以及调用某个特定的方法不同,变更"field"内容 不需要参数和自变量。首先调用Class的getField()并制定field名称。获得特定的Field Object之后便可以直接调用Field的get()和set()。


代码:

 

可以在一个类中修改另一个类中的私有成员变量吗?
 呵呵,如果你是一位rookie,相信你一定会说不可以,其实通过反射机制是可以修改的,先看看下面两个方法:

<!-- Generated by javadoc (build 1.6.0) on Wed Nov 29 02:21:23 PST 2006 -->

 Field

getDeclaredField (String  name)
          Returns a Field object that reflects the specified declared field of the class or interface represented by this Class object.

 Field getField (String  name)
          Returns a Field object that reflects the specified public member field of the class or interface represented by this Class object.

 

还要看看另外一个关键的类:

public class AccessibleObject extends Object implements AnnotatedElement

<!-- Generated by javadoc (build 1.6.0) on Wed Nov 29 02:21:29 PST 2006 -->

The AccessibleObject class is the base class for Field, Method and Constructor objects. It provides the ability to flag a reflected object as suppressing default Java language access control checks when it is used. The access checks --for public, default (package) access, protected, and private members--are performed when Fields, Methods or Constructors are used to set or get fields, to invoke methods, or to create and initialize new instances of classes, respectively.

从上面可以看出,AccessibleObject类是Field,Method和Constructor的基类,使用它可以提供对JAVA语言访问控制检查的一种”压制“,访问检查大家都应该很清楚,是指对于public, default (package) , protected, private修饰的成员,当设置或者获取字段的值,调用方法,或者是创建一个类的实例时进行的一种访问控制检查,因为大家都知道上面四种访问修饰符都有自己的访问权限,访问检查便提供了对这些访问权限的检查。

但是AccessibleObject提供了对访问控制检查的一种压制能力,也就是说,利用它可以设置或者取消这种访问检测能力。

再看看下面的这个方法:

public void setAccessible(boolean flag) throws SecurityException

Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.

<!-- Generated by javadoc (build 1.6.0) on Wed Nov 29 02:21:29 PST 2006 -->

调用setAccessible方法并设置参数值为true时,便可以实现对当前成员的访问检测的压制,即是说调用Field,Method,Constructor的setAccessibleObject(true)时会使字段,方法,和构造方法的控制检测失效,以达到我们上面修改另一个类的私有成员的目的。

参加下面的代码:

public class PrivateTest {
	private String str;
	public PrivateTest(String str) {
		this.str = str;
	}
	public String getStr() {
		return str;
	}
}

public class ReflectionTest {
	public static void main(String[] args) throws Exception {
		PrivateTest pt = new PrivateTest("hello");
		//得到PrivateTest的Class对象,通过调用对象的getClass()或者直接从类得到
//		Class classType = pt.getClass();
		Class classType = PrivateTest.class;
		//得到相应class中指定名称字段的Field对象
		Field field = classType.getDeclaredField("str");
//		Field field = classType.getField("str"); 使用此方法不能得到private修饰符修饰的成员
		//设置该字段的setAccessible方法值为true,即压制访问检测
		field.setAccessible(true);
		//直接通过Field的get方法获得参数对应的对象的字段值
		String str = (String) field.get(pt);
		System.out.println(str);
		//压制访问检测后,通过Field的set方法为类的似有字段设置值
		field.set(pt, "world");
		System.out.println(pt.getStr());
	}
}
 

 

 

  • 大小: 81.4 KB
  • 大小: 76.5 KB
  • 大小: 52.8 KB
  • 大小: 34.2 KB
分享到:
评论

相关推荐

    java反射笔记

    在“java反射笔记”这个主题中,我们将深入探讨反射的基础知识和常见用法。 首先,我们需要了解什么是反射。在Java中,反射是指在运行时获取类的信息(如类名、方法名、参数类型等)并动态调用对象的方法或访问其...

    java注解和反射的个人学习笔记

    java注解和反射的个人学习笔记

    JAVA反射笔记 md格式

    Java反射是Java编程语言中的一个强大特性,它允许运行时的程序访问并操作类、接口、字段和方法等对象,即使这些对象在编译时并未知。这为开发者提供了动态性,可以处理未知类型的对象,或者在运行时发现和调用类的...

    java学习笔记java反射机制

    java学习笔记java反射机制

    Java反射笔记源代码

    Java反射是Java编程语言中的一个强大特性,它允许程序在运行时检查类、接口、字段和方法的信息,并能动态地创建对象和调用方法。在深入理解Java反射之前,我们首先要明白,它属于元编程的一部分,即在编写程序时能够...

    JAVA 私塾笔记整理——反射机制(Reflection)

    Java反射机制是Java编程语言中的一个强大特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。这个特性使得Java具有了高度的灵活性和动态性,尤其是在处理对象、类、接口以及它们之间的关系...

    java学习笔记(java 反射机制 流 内存管理)

    本笔记主要涵盖了四个核心知识点:Java反射机制、流(I/O流)、内存管理和Java学习的基础。以下是对这些主题的详细阐述: 一、Java反射机制 Java反射机制是Java语言的一个强大特性,允许程序在运行时检查类、接口、...

    Java反射机制笔记(简单易懂)

    Java反射机制笔记 Java反射机制是Java语言中一个强大的功能,它允许程序在运行时检查和修改其自身的结构和行为。通过Java反射机制,我们可以在运行时获取类的信息,包括类的成员变量、方法、构造方法等,并可以动态...

    早期自学java反射知识笔记

    "Java 反射机制详解" Java 反射机制是 Java 语言中的一种强大功能,允许程序在运行时检查和修改自身的结构和行为。它主要用于动态的创建对象、调用方法和访问属性等。 ### Java 反射机制的定义 Java 反射机制是指...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    java学习笔记markdown

    8. **反射机制**:探讨Java反射API的使用,包括动态获取类信息、创建对象、调用方法等功能,这对于理解和调试程序有很大的帮助。 9. **JVM内部机制**:简述Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收...

    java全套笔记 来自狂神说java笔录.zip

    【Java编程语言基础】 Java是一种广泛使用的面向对象的编程...这些笔记内容全面覆盖了Java的基础和进阶知识,适合从零开始学习Java的人群,通过系统学习,可以建立起扎实的Java编程基础,为实战项目开发打下坚实基础。

    Java-反射笔记.pdf

    本笔记将深入探讨Java反射的原理、用途以及如何使用。 一、反射的概念与作用 反射是Java提供的一种能力,它允许程序在运行时动态地获取类的信息(如类名、方法名、参数类型等)并调用这些方法。这种动态性使得Java...

    java反射与动态代理笔记

    Java反射和动态代理是Java编程中的重要特性,它们在实现高度灵活和动态的代码执行方面发挥着关键作用。本文将深入探讨这两个概念及其在实际开发中的应用。 **Java反射** Java反射API允许程序在运行时检查类、接口...

    JAVA学习笔记 林信良

    《JAVA学习笔记》是林信良先生的一部深入浅出的Java编程教程,旨在帮助初学者和有一定经验的开发者巩固和提升Java编程技能。这本书涵盖了Java语言的基础到高级概念,是一份宝贵的自学资料。 首先,从基础部分开始,...

    java学习——java中的反射学习笔记.rar_java 反射

    本篇笔记将深入探讨Java反射的概念、重要性以及如何使用。 一、反射基础 1. 类加载:当Java虚拟机(JVM)加载一个类时,它会创建该类的Class对象。这个对象包含了关于类的所有信息,包括方法、字段、构造器等。...

    java笔记.zip

    尚硅谷康师傅java学习笔记。 、2020-4-5 java学习笔记 2020-4-6 java笔记 ---内部类 2020-4-6 java笔记 ---异常 2020-4-6 java笔记 --多线程 ...2020-4-21 java反射 2020-4-22 java8 新特性 2020-4-27 单元测试

    宋红康java笔记.rar

    8. **反射**:反射是Java的一种强大的工具,可以动态地获取类的信息并操作对象。学习Class类,以及newInstance()、getMethod()、getField()等方法的应用。 9. **泛型**:泛型引入了类型参数化,提高了代码的类型...

    李兴华java笔记

    2. **异常处理**:Java中的异常处理机制是程序健壮性的重要保障。笔记详细介绍了如何使用try-catch-finally语句块,以及各种常见的异常类型。 3. **集合框架**:Java集合框架是处理对象集合的重要工具,包括List、...

    达内Java_笔记整理.rar_Java 达内笔记_Java笔记_java 笔记_笔记_达内

    对于Java SE中的高级特性,例如反射、注解、动态代理等,笔记可能也会有详细讲解。这些特性使得Java具备了强大的元编程能力,可以用于实现许多复杂的设计模式。 除此之外,如果这份笔记还包含Java EE部分,那么Web...

Global site tag (gtag.js) - Google Analytics