- 浏览: 831600 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (149)
- ubuntu (27)
- spring (3)
- hibernate (6)
- struts (1)
- jquery (11)
- ext (2)
- ajax (1)
- java (24)
- 设计 (4)
- db (10)
- web (10)
- 软件应用技巧 (6)
- others (2)
- 设计模式 (1)
- subversion (5)
- javascript (2)
- jpa (1)
- windows (6)
- jboss (1)
- junit (2)
- WebSphere (2)
- log4j (2)
- 新闻和感想 (0)
- ldap (3)
- tomcat (6)
- excel (1)
- PDF (1)
- xml (1)
- json (2)
- 正则表达式 (3)
最新评论
-
sunshine_love:
谢啦
svn:ignore 的用处 -
亮0000仔:
非常好。。
JAVA中浮点数的存储 -
u011840397:
你好,备份和还原到指定的目录的参数如何加呢?
svn备份和还原 -
zhglhy:
简单明了,学习了,感谢分享!
Jboss数据源密码加密 -
wmengmeng66:
写的很好,顶
spring中配置proxool数据源
曾经碰到一件怪事:Spring可以把构造函数为私有的对象实例也给创建出来,当时没去研究为何。直到今天突然想起,查了一下,找到此文:http://yh-private.iteye.com/blog/183345 ,于是给转了过来,javaeye没有直接转载的功能,真有些不方便啊。
1.私有构造函数的调用:
主要的类:java.lang.reflect.Constructor
首先要拿到构造方法,具体如下:
Class clazz = Class.forName("Bean");
Constructor[] cons = clazz.getDeclaredConstructors();
这样拿到的cons数组保存着所有的这个类的构造函数,包括私有的和公有的。
迭代并调用con.toGenericString()可以拿到每个构造方法的全限定名(带修饰符,带参数)。
如果要拿单个构造方法,可以调用getDeclaredConstructor(Class args);来拿,只要参数匹配了就可以得到,如果没有参数,则传null即可。
然后需要调用Constructor的方法setAccessible设置为true,表示允许使用私有构造函数。这个方法是父类 AccessibleObject的方法,这个类的自类有Constructor, Field, Method分别代表构造函数,成员变量,和成员方法。也就是说使用这个方法,可以访问类的所有的方法、变量、构造函数。
最后,使用Constructor的newInstance方法就可以把对象创建出来了:
Bean bean = (Bean)con.newInstance(Object args);
没有参数的构造函数可以传null进去。
2.调用私有的方法:
主要的类:java.lang.reflect.Method
首先还是要拿到那个私有的方法,可以调用
Method[] ms = clazz.getDeclaredMethods();来拿到所有的方法的集合。
也可以拿某个单独的方法:getDeclaredMethod(String name, Class... parameterTypes)匹配名字和参数的方法会被拿到,方法若没有参数传null.
同样可以调用toGenericString()看全限定名。
然后同样需要调用setAccessible(true)来设置可以方法私有方法。
最后,就可以使用method.invoke(bean, Object args);来调用这个方法。两个参数分别是对象,和这个方法的参数。
3.调用私有成员变量,也叫字段。
主要类:java.lang.reflect.Field
首先还是要拿到要使用的字段:
还是两种,拿全部:Field[] fs = clazz.getDeclaredFields();
拿某个:clazz.getDeclaredField(String fieldName);
老步骤:setAccessible(true)
最后, f.get(obj) ,就能拿到传入对象的私有变量。
1.私有构造函数的调用:
主要的类:java.lang.reflect.Constructor
首先要拿到构造方法,具体如下:
Class clazz = Class.forName("Bean");
Constructor[] cons = clazz.getDeclaredConstructors();
这样拿到的cons数组保存着所有的这个类的构造函数,包括私有的和公有的。
迭代并调用con.toGenericString()可以拿到每个构造方法的全限定名(带修饰符,带参数)。
如果要拿单个构造方法,可以调用getDeclaredConstructor(Class args);来拿,只要参数匹配了就可以得到,如果没有参数,则传null即可。
然后需要调用Constructor的方法setAccessible设置为true,表示允许使用私有构造函数。这个方法是父类 AccessibleObject的方法,这个类的自类有Constructor, Field, Method分别代表构造函数,成员变量,和成员方法。也就是说使用这个方法,可以访问类的所有的方法、变量、构造函数。
最后,使用Constructor的newInstance方法就可以把对象创建出来了:
Bean bean = (Bean)con.newInstance(Object args);
没有参数的构造函数可以传null进去。
2.调用私有的方法:
主要的类:java.lang.reflect.Method
首先还是要拿到那个私有的方法,可以调用
Method[] ms = clazz.getDeclaredMethods();来拿到所有的方法的集合。
也可以拿某个单独的方法:getDeclaredMethod(String name, Class... parameterTypes)匹配名字和参数的方法会被拿到,方法若没有参数传null.
同样可以调用toGenericString()看全限定名。
然后同样需要调用setAccessible(true)来设置可以方法私有方法。
最后,就可以使用method.invoke(bean, Object args);来调用这个方法。两个参数分别是对象,和这个方法的参数。
3.调用私有成员变量,也叫字段。
主要类:java.lang.reflect.Field
首先还是要拿到要使用的字段:
还是两种,拿全部:Field[] fs = clazz.getDeclaredFields();
拿某个:clazz.getDeclaredField(String fieldName);
老步骤:setAccessible(true)
最后, f.get(obj) ,就能拿到传入对象的私有变量。
MyBean.java : package cn.yzj.entities; public class MyBean { private String name; private Integer age; private MyBean() { this.name ="ABC"; } private MyBean(String name,Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } private void printName() { System.out.println(this.name); } }
package cn.yzj; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import cn.yzj.entities.MyBean; public class Test1 { public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException { Class clazz = Class.forName("cn.yzj.entities.MyBean"); // 获得私有成员变量并返回. // getField(clazz); // 调用私有方法 // getMethod(clazz); // 用私有构造方法构造对象并返回. // getConstrutor(clazz); } //用私有构造方法构建实例的方法 private static MyBean getConstrutor(Class clazz) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { // 拿所有的构造方法. /* * Constructor[] cons = clazz.getDeclaredConstructors(); for(Constructor * con : cons) { System.out.println(con.toGenericString()); } */ // 1.拿无参数的构造方法. Constructor con = clazz.getDeclaredConstructor(null); // 2.设置可以访问. con.setAccessible(true); // 3.创建实例 MyBean myBean = (MyBean) con.newInstance(null); return myBean; } private static Object getField(Class clazz) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { MyBean myBean = getConstrutor(clazz); Field[] fs = clazz.getDeclaredFields(); for (Field f : fs) { System.out.println(f.toGenericString()); } fs[0].setAccessible(true); return fs[0].get(myBean); } private static void getMethod(Class clazz) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException { MyBean myBean = getConstrutor(clazz); Method[] ms = clazz.getDeclaredMethods(); for (Method m : ms) { System.out.println(m.toGenericString()); } ms[0].setAccessible(true); ms[0].invoke(myBean, null); } }
发表评论
-
运算符优先级
2010-11-04 14:28 1813最近在研究表达式求值,看了下论坛推荐的JSEL和Aviator ... -
log4j日志文件保存路径的设置
2010-08-12 11:56 6688一直都是把log4j的日志文件位置设定成绝对路径,直到今天发 ... -
jsp页面突然不支持EL的问题
2010-07-12 16:11 2032转自http://www.iteye.com/topic/15 ... -
jvm监控
2010-07-08 00:49 15790一直没有做过jvm监控, 总以为要找些专门的工具才能做jvm监 ... -
JAVA从键盘读取输入信息
2010-02-28 17:58 2704import java.io.BufferedReader; ... -
JAVA UUID
2010-02-26 23:24 4406UUID(Universally Unique Identif ... -
JAVA中浮点数的运算
2010-02-24 15:30 1621问题的提出: 如果我们编译运行下面这个程序会看到什么 ... -
JAVA中控制double和float的精度
2010-02-24 15:21 7664本篇介绍了在JAVA中如何对double或者float的浮点数 ... -
JAVA的位移运算
2010-02-24 10:38 1074左移操作: x << nx可以是byte, ... -
各种排序JAVA实现
2009-12-15 17:25 1094package sort; import ... -
JDK自带VM分析工具jps,jstat,jmap,jconsole
2009-08-13 13:13 1669转自:http://jiajun.iteye.com/blog ... -
javabean属性命名难以为人所知的秘密
2009-07-09 10:46 3497原文:http://www.blogjav ... -
java properties文件读取乱码问题解决之道
2009-06-10 11:09 4729Poperties Editor 插件------ ... -
正则表达式参考
2009-05-21 01:40 928http://www.cnblogs.com/netshuai ... -
Apache Commons Logging 是如何决定使用哪个日志实现类的
2009-05-20 11:36 7566原文是:http://www.blogjava.net/Unm ... -
java keytool 常用命令
2009-05-05 17:10 5377最近在做ssl连接active dir ... -
java.sql.Date,java.sql.Time和java.sql.Timestamp
2009-02-07 13:12 9245java.sql.Date,java.sq ... -
理解Unsupported major.minor version 49.0为何错误
2008-09-09 11:33 2627今天一位同事在发布一个portlet到ibm portal时报 ... -
关于Java异常抛出和处理的思考
2008-07-30 17:38 7971看过不少关于java异常处 ... -
jdk5 concurrent 初学
2008-07-22 11:50 2374由于上次发现了ReentrantLock,同步的另外一种实现, ...
相关推荐
java 反射 调用私有方法(有参数私有方法)获取私有属性值
Method,invoke,getMethod等反射私有方法和私有属性
Java反射访问私有变量和私有方法
反射私有内部类的例子 反射私有内部类的例子反射私有内部类的例子
Java 反射详解(包含私有方法属性的调用)
C#net反射实现访问类中的私有变量或者方法
介绍一篇关于PHP通过反射方法调用执行类中的私有方法,希望这篇教程能够帮助到各位朋友,有兴趣的可以进来看看。具有完整的反射 API,添加了对类、接口、函数、方法和扩展进行反向工程的能力。
Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法
C#私有成员反射调用类库
学习反射.调用反射内的方法 C# 加载Dll 使用反射 调用对应的方法公开方法,私有方法,泛型方法
3.4 获取私有的变量(利用暴力反射) 4. 反射获取构造方法 4.1有参构造 4.2无参构造 4.3无参构造简便写法 5.反射获取成员方法 5.1无参方法 5.2 有参方法 5.3 获取所有方法(包含Object的方法)
利用java反射机制修改类的私有成员的例子,如果需要了解反射机制的可以参考下。
JUnit4利用反射机制测试类的私有成员
Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。
下面小编就为大家带来一篇利用java反射机制调用类的私有方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)
Java反射机制修改私有成员变量的实现_Reflection,普通方式无法修改私有成员变量的值,但通过反射机制可以实现。
绍Java反射获取私有构造函数、属性、方法
反射高手巧妙实现强行私有成员源代码 反射高手巧妙实现强行私有成员源代码 反射高手巧妙实现强行私有成员源代码