- 浏览: 186017 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
netwelfare:
这篇文章关于jsessionid讲解的不错。关于jsessio ...
关于JSessionID【转】 -
ITcms:
Activity直接执行了onCreate方法的那部分,我觉得 ...
Android之Activity学习 -
tinygroup:
Sorry发错了。
蛇形矩阵的java实现 -
tinygroup:
public static int[][] spira ...
蛇形矩阵的java实现 -
laitao:
[*]引用pulic djs
Servlet的生命周期
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
|
|
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()); } }
发表评论
-
Java序列化机制和原理【转】
2011-05-18 09:14 1080序列化的必要性 Java中,一切都是对象,在分布式环境中经 ... -
JAVA反射机制的应用(2)
2010-12-07 16:28 1188JAVA反射机制的应用(2 ... -
JAVA反射机制的简单应用(1)
2010-12-06 13:15 1373JAVA反射机制的简单应用(1) Spring中的IOC ... -
java反射学习笔记
2010-12-05 10:21 1519java反射作用: 1、自省:通过对象自身获得类结构,继 ... -
Java反射笔记(1)
2010-12-01 10:54 1096感谢张龙老师的视频:http://www.verycd.com ... -
连接池的基本工作原理及简单实现
2010-11-24 21:25 873连接池的基本工 ... -
Java 继承与组合的区别
2010-11-22 10:36 7943根据网络上大家对 ... -
蛇形矩阵的java实现
2010-11-10 22:22 7812题目: 计算并输出 nXn ... -
两个矩阵的乘积的java实现
2010-11-10 16:23 8290题目: 计算两个矩阵 A、B 的乘积矩阵 C。 ... -
螺旋数组的java实现
2010-11-10 15:26 2046螺旋数组 要求:存储和输出nXm的螺旋数组,其中n和m为 ... -
统计一个整数中出现次数最多最大的数字
2010-11-10 09:31 6495要求: 统计一个整数中出现最多的数字。如果数字个数 ... -
“百元买百鸡问题”之一重循环实现
2010-11-09 10:06 3672问题描述: 每只母鸡 3 元,每只公鸡 4 元,每只小鸡 0 ... -
[转]欧几里得算法(辗转相除法)求最大公约数
2010-11-08 22:52 2815欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数 ... -
[转]深入理解自增自减运算符a=a++和a=++a
2010-11-07 23:04 3190更深入地理解自增自减运算符 首先贴一个非常简洁却 ... -
[转]java中char,byte,short的移位操作
2010-11-07 22:38 4707在Think in Java中有这么一段话“对c ... -
笔试题之以单词为最小单位翻转字符串
2010-11-06 15:39 2350最近做了几个公司 ... -
java解惑之无穷大和NaN
2010-11-01 10:12 17461、i == i + 1 一个数字永远不会等于它自己加1 ... -
java 死锁及解决
2010-10-31 21:28 1096Java线程死锁如何避免 ... -
深入Java关键字null
2010-10-31 14:20 807深入Java关键字null ... -
对java中equals和hashCode函数的一些理解2(转)
2010-10-31 11:24 1022一致性 即如果两个对象相等的话,那么它们必须始终保持相等,除非 ...
相关推荐
JAVA反射笔记
java注解和反射的个人学习笔记
java反射学习的一些基础代码,简单使用反射的案例,为eclipse中的工作空间,编码GBK
Java反射笔记源代码
Java反射机制笔记,简单易懂,轻松搞定Java反射机制
java学习笔记java反射机制
Java-反射笔记.pdf
这是一年多以来学习java和在项目中遇到问题之后总结出的一系列资料。包含:java 反射机制 流 内存管理等信息。
轻松掌握java反射技术,虽然讲得比较简单,但是通俗易懂。
早期自学java反射知识笔记
java反射与动态代理
java学习——java中的反射学习笔记
尚硅谷康师傅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反射的笔记,在学习java者可以看看
java基础之一反射笔记
这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 我的代码里主要有一下知识点: 1.获取Class对象的三种方式 2.获取构造方法并调用 3.获取成员方法 4.获取成员变量 5.反射数组 6.通过反射...
Java反射机制总结(实例分析) Java反射机制学习笔记
java反射机制
java学习笔记 [Java学习笔记doc]之反射机制