- 浏览: 514641 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
1) java.lang.Class
在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时的类型标识。这个信息保存着每个对象所属的类足迹。
虚拟机利用运行时信息选择相应的方法执行。保存这些信息的类被称为Class,Object类中的getClass()方法将会返回一个Class类
的实例。获取Class类对象有三种方式:
a)Object类getClass()方法
eg: Employee e
.....
Class cl = e.getClass();
b)Class类的静态方法forName()
eg: String className = "java.util.Date";
Class cl = Class.forName(className);
c)任意类型的class属性
eg: Class cl1 = Date.class;
Class cl2 = int.class;
Class cl3 = Double[].class;
:) 很有嚼头的两句话:
:) 如同用一个Employee对象表示一个特定的顾员属性一样,一个Class对象将表示一个特定类的属性。
:) 一个Calss对象实际上表示的是一个类型,而这个类型未必一定是一种类。例如,int不是类,但int.class是一个Class类型的对象。
2) java.lang.reflect.Constructor
3) java.lang.reflect.Field
4) java.lang.reflect.Method
分别描述类的构造器,域,方法。
5) java.lang.reflect.AccessibleObject
为反射对象设置可访问标志。使得对象的私有属性也可以被查询和设置,是Field, Method和Constructor类的共公超类
利用反射对私有属性/方法进行设置/调用
文章分类:Java编程 关键字: 开发 反射 私有
因一时兴起看了一些有关 Java 反射( Reflection )的东西。以下要说明的问题是如何直接对某个特定类的私有属性( private field )不使用其暴露的 set 方法而是直接进行设值操作,或调用类的私有方法( private method )。
首先要说明的是,这在 java 里是允许这么做的。虽然这样直接访问私有属性或调用私有方法,会破坏了 OO 的一大基本原则:封装,但 Java 里是千真万确的提供了这么做的基础的。一些 Open source framework 的“豪华”功能也是依赖于此的。
此前在网上看到不少兄弟提出过这样的问题,有人略带讽刺的回复说这样做是不可以的。在这里不才给出一个简单的示例来说明如何完成的这个被看成 Mission Imposable 的。
首先我们建立一个测试用的类( TargetClass ):
package org.rossalee.test;
public class TargetClass {
public String name ;
private String age ;
public TargetClass() {
super ();
}
public void showName() {
System. out .println( name );
}
private void showAge() {
System. out .println( age );
}
}
这个目标类里有一个 public 权限 String 类型 “ name ” 属性和一个 private 权限 String 类型的“ age ”属性,以及一个 public 方法“ showName() ”和 private 方法“ showAge() ”。
一般来说我们是可以直接操作该类的 name 属性或调用 showName() 方法的。这都是很正常。但如果想要对 age 属性进行设值的话,那就只能依靠 TargeClass 提供一个修饰为 public 的 setAge(String age) 的设值方法,才能进行设值。但我们上面这个类里并没有提供,所以那这个 age 属性基本上是没有办法进行再设值的了。同样,我们也不可以调 TargetClass 类的 shwoAge() 方法。因为他也是 private 的。
但我们使用 Java Core API 提供的 Reflect 就可以完成这个功能。
以下是实现对私有属性进行操作的基本步骤:
<!-- -->一、 <!-- -->使用 Class 对象提供的 static 方法 forName() 方法,将类进行加载,成为 Java 里一种特殊的对象——类对象。
<!-- -->二、
<!-- -->使用
Class
对象提供的方法
getDeclaredFields()
,此方法
返回
Field
对象的一个数组,这些对象反映此
Class
对象所表示的类或接口所声明的所有字段。即有公共的也有私有的。
<!-- -->三、 <!-- -->调用对于要进行操作的 field 对象的 setAccessible() 。参数传入“ true ”。此方法从 java.lang.reflect.AccessibleObject 对象中继承而来。执行该方法后,就可以对 age 属性进行操作了。但设值是要有特定的方法来实现的。另外,还有一点要说明的是,此时加载的类对象是没有实例化的,所以最终我们要进行设值的并不是这个类对象,而 TargetClass 类型的对象。这个对象你可以自己 new 出来,也可以通过调用类对象的 newInstance() 方法实例出来。在这里我们暂定这个 new 出来的 TargetClass 对象为 tc ,即:
TargetClass tc=new TargetClass() 。
<!-- -->四、 <!-- -->这时我们要用 Field 对象提供的 set(Object obj, Object value) 方法进行设置。这个方法有两个参数: obj 就传入我们在一步 new 出来的 tc 。 Value 就传入 age 所属类型的值,这里的 age 是 String 类型,这里传一个 String 进来就可以了。
对于私有方法的调用也基本相同,但只是最后使用的是 Method 对象的 invoke(Object obj, Object... args) 方法。 Obj 一样也是 tc , args 则是 showAge() 方法的参数,这里是无参的,所以传一个 null 进去就可以了。
实现代码如下:
package org.rossalee;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.rossalee.test.TargetClass;
public class TestMain {
public static void main(String[] args) {
Class clazz = null ;
try {
clazz = Class.forName ( "org.rossalee.test.TargetClass" );
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Field[] f = clazz.getDeclaredFields();
for ( int i = 0; i < f. length ; i++) {
System. out .println( "Field " + i + " : " + f[i].getName());
}
Method[] m = clazz.getDeclaredMethods();
for ( int i = 0; i < m. length ; i++) {
System. out .println( "Method " + i + " : " + m[i].getName());
}
TargetClass tc = null ;
try {
tc = (TargetClass) clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
f[1].setAccessible( true );
try {
f[1].set(tc, "kenshin" );
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
m[1].setAccessible( true );
try {
m[1].invoke(tc, null );
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
发表评论
-
关于JAVA多线程同步
2011-09-29 10:39 826因为需要,最近关注了一下JAVA多线程同步问题。JAVA多线程 ... -
java多线程之 wait(),notify(),notifyAll()
2011-05-27 17:25 1373wait(),notify(),notifyAll()不属 ... -
JAVA反射机制的学习
2010-11-15 22:54 895JAVA反射机制的学习2009-07-06 11:33JAVA ... -
Java线程:线程的交互
2010-07-21 09:26 942Java线程:线程的交互 ---------------- ... -
JSP数据导出到EXCEL超简便方法
2010-05-24 09:31 1672JSP数据导出到EXCEL简便方法(2008-11-19 15 ... -
iText经验总结
2010-05-04 21:49 2438iText经验总结 因为前些 ... -
org.apache.commons.lang.StringUtil 常用方法使用例子
2010-03-26 11:00 10711.空字符串检查使用函数: StringUtils.isBla ... -
java 多线程 实现
2010-03-10 15:20 990多线程是这样一种机制 ... -
iText 跨行and背景图片
2009-08-25 20:33 2672最近用iText生成pdf文件供下载和当做附件email, 第 ... -
利用iText写PDF心得
2009-08-11 09:56 1491利用iText写PDF心得 & ... -
使用itext生成pdf
2009-08-10 11:20 1446一、前言 在企业的信息系统中,报表处理一直占比较重要的作 ... -
java 生成excel
2009-05-15 11:24 16061.类文件makexls package com; impor ... -
jsp分页
2009-03-06 10:43 869public class PageHelper { //to ... -
JSP环境配置使用fckeditor
2009-02-18 09:59 1236JSP环境配置使用fckeditor 录入时间 2008-12 ... -
使用J2SE API读取Properties文件的六种方法
2008-10-07 19:27 797使用J2SE API读取Properties文件的六种方法 ... -
native2ascii转码
2008-10-07 17:22 14211,原理 Property 文件中 ...
相关推荐
java反射机制java反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制.zipjava反射机制...
JAVA反射机制应用 JAVA反射机制是JAVA语言中的一种动态机制,它能够在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。这种动态获取的信息以及动态...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息。通过Java反射机制,开发者可以在不知道具体类名的情况下创建对象,调用方法,访问和修改私有成员变量,以及...
Java反射机制是Java编程语言中的一个重要特性,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射机制的核心类集中在java.lang.reflect包下,包括Class、Constructor、Method和...
### Java反射机制深入理解 #### 一、反射机制概述 Java反射机制是一种强大的工具,它允许程序在运行时检查和操作任何类、方法、构造函数和字段等元素。这种能力对于构建灵活的应用程序和框架非常有用,特别是那些...
Java反射机制是Java语言提供的一种强大工具,它允许在程序运行时动态地获取类的信息以及对类的对象进行操作。在Java中,静态编译时类型检查确保了代码的稳定性,但有时我们需要在运行时根据需求动态地创建对象、调用...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、对象等的内部结构。通过反射,开发者可以动态地获取类的信息并调用其方法,创建对象,访问私有成员,甚至改变类的行为。在深入...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时获取和操作任何已知名称的类的内部信息。这一机制使得Java具备了一定的动态性,虽然在传统的分类中Java被视为静态类型语言。通过反射,开发者可以在...
Java 反射机制是 Java 语言中的一个重要特性,它允许程序在运行时动态地获取类的信息(如类名、属性、方法等)并调用对象的方法,甚至修改对象的状态。这一机制极大地增强了 Java 程序的灵活性和可扩展性,尤其是在...
这篇博文"Java反射机制学习(二)"可能深入探讨了如何利用反射进行动态类型处理、访问私有成员以及创建对象等核心概念。在这里,我们将详细讨论Java反射的基本用法及其在实际开发中的应用。 1. **什么是反射**: ...
java反射机制和动态代理的原理,熟悉反射机制和动态代理
### Java反射机制详解 #### 一、Java反射机制概述 Java反射机制是Java语言的一个重要特性,它允许程序在运行时获取类的信息并操作对象。Java反射机制的主要作用包括:获取类的所有属性和方法、构造动态实例、调用...
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这种机制使得Java具有高度的灵活性和动态性,可以在编译时未知类的情况下进行类的加载、实例化、方法调用等操作...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查和操作类、接口、字段和方法的信息。这个特性使得Java具备了高度的灵活性,能够在运行时动态地发现和使用类的属性和方法,即使这些信息在编译时...
Java反射机制是Java编程语言中的一个强大特性,它允许程序在运行时检查并操作类、接口、字段和方法的信息,打破了通常编译时静态绑定的限制。通过反射,我们可以动态地创建对象,调用方法,访问和修改字段值,甚至...
### Java反射机制详解 #### 一、引言 在Java面试中,经常会出现与反射机制相关的题目。这是因为Java反射机制不仅是Java语言的一项重要特性,也是理解Java动态特性的关键所在。通过本文,我们将深入探讨Java反射...
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
Java反射机制是Java编程语言中的一个重要特性,它允许程序在运行时动态地获取类的信息并进行操作。通过反射,开发者可以在程序执行时发现并访问类的字段(fields)、方法(methods)以及构造器(constructors),...