- 浏览: 172943 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenyi1125:
StateStats 是自己定义的类吧,有哪些属性,如何与我 ...
mongodb sum 操作 -
yongquan812:
...
最全的 Twitter Bootstrap 开发资源清单 -
mccxj:
不是已经提供个params的属性来添加路径的参数了么?我对分页 ...
grails 查询结果分页 简单实现 -
sphinxdwood:
请问第22行有什么用?params.ft_inlist = K ...
grails 查询结果分页 简单实现 -
walsh:
classpath的配置不正确吧
java基础
单例类:
package com.shenli.test; public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } private int intValue = -1; public int getIntValue(){ return this.intValue; } @Override public String toString() { return String.valueOf(hashCode()).concat(",").concat(String.valueOf(intValue)); } }
它是一个单例类,并且拥有一个私有属性intValue,现在我们使用反射机制来改变私有属性,并且创建新的实例对象:
package com.shenli.test; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class TestReflect { public static void main(String[] args) { Singleton s = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println("before change private value."); System.out.println("\t s:"+s+",\n\t s2:"+s2); Class clazz = Singleton.class; Field field; try { field = clazz.getDeclaredField("intValue"); field.setAccessible(true); field.setInt(s2, 100); } catch (NoSuchFieldException | SecurityException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } System.out.println("\n After use reflect change private:"); System.out.println("\t s:"+s+",\n\ts2:"+s2); try { Constructor<Singleton>[] constructors = clazz.getDeclaredConstructors(); for(Constructor<Singleton> constructor : constructors){ constructor.setAccessible(true); Singleton s3 = constructor.newInstance(); System.out.println("\n After use reflect change constructor."); System.out.println("\t s:"+s+",\n\t s2:"+s2+"\n\t s3:"+s3); } } catch (SecurityException e) { e.printStackTrace(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println("\nSo the private value can be change, \nand Singleton object can be Re-created."); } }
输出:
before change private value.
s:1143701442,-1,
s2:1143701442,-1
After use reflect change private:
s:1143701442,100,
s2:1143701442,100
After use reflect change constructor.
s:1143701442,100,
s2:1143701442,100
s3:1956785676,-1
So the private value can be change,
and Singleton object can be created many times.
如果不希望私有属性被更改,可以声明为final
如果单例类不会重复创建,就要在私有构造函数里面抛出异常。
更改后的Singleton如下:
package com.shenli.test; public final class Singleton { private static final Singleton singleton = new Singleton(); private Singleton(){ if(singleton != null){ throw new RuntimeException("The class Singleton can not be re-created!"); } } public static Singleton getInstance(){ return singleton; } private final int intValue = -1; public int getIntValue(){ return this.intValue; } @Override public String toString() { return String.valueOf(hashCode()).concat(",").concat(String.valueOf(intValue)); } }
运行测试程序后的输出:
before change private value.
s:64011397,-1,
s2:64011397,-1
After use reflect change private:
s:64011397,-1,
s2:64011397,-1
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.shenli.test.TestReflect.main(TestReflect.java:46)
Caused by: java.lang.RuntimeException: The class Singleton can not be re-created!
at com.shenli.test.Singleton.<init>(Singleton.java:9)
... 5 more
发表评论
-
mybatis 一些总结
2014-04-09 13:06 1283最近用mybatis开发,一些总结: 结合spring ... -
STOMP protocol
2013-12-18 00:41 1103STOMP,Streaming Text Ori ... -
log4j.xml web.xml配置
2012-10-29 23:53 9825log4j.xml配置实现配置实现配置实现配置实现 先写 ... -
log4j.xml 配置
2012-10-29 23:30 928<?xml version="1.0& ... -
Maven 2 plugin fails with cannot find symbol exception when defining two locatio
2012-10-17 23:58 1176https://confluence.atlassian.co ... -
maven 1.5 编译级别
2012-09-25 10:36 783在pom.mxl中增加以下内容 <b ... -
eclipse debug 问题解决
2012-05-18 15:15 0eclipse 问题解决 问题描述:3.7.2里面安装了mav ... -
eclipse plugin update
2012-05-18 14:52 798eclipse plugin update site 总结 ... -
JVM 学习 (2)实战 OutOfMemoryError异常
2012-03-13 17:37 0首先来制造Java堆溢出: import jav ... -
JVM 学习(1)运行时数据区
2012-03-13 11:40 802今天开始学习JVM 先看看运行时数据区的结构: ... -
Ubuntu 上使用 Rxtx
2009-09-04 17:45 0ubuntu下安装和配置RXTX实现串口通讯 RXTX是一套 ... -
自己写的线程池
2009-06-05 15:54 13451 .线程池类:TPTaskProxy import ... -
Ant 获取svn工程并编译
2008-08-05 12:49 3245<?xml version="1.0" ... -
Acegi配置文档
2008-08-05 12:40 1018Acegi是基于Spring的一个 ... -
java基础
2008-06-05 13:33 2260Java基础 从事java相关的编程工 ... -
JBoss Rules 2
2008-06-05 11:40 1166JBoss Rules 学习(二): RETE算法 在JBo ... -
JBoss Rules 1
2008-06-05 11:33 1609JBoss Rules 学习(一): 什么是Rule ... -
junit4参数化测试和easymock的使用
2008-06-05 11:20 3289利用junit4的一些新特性,我们可以方便的对多个参数进行测试 ... -
html编码转换工具
2008-06-04 13:07 3026对于html的特殊标记的处理,有一个好办法,可以轻松的实现ht ...
相关推荐
Java反射机制修改私有成员变量的实现_Reflection,普通方式无法修改私有成员变量的值,但通过反射机制可以实现。
java 反射 调用私有方法(有参数私有方法)获取私有属性值
使用JAVA反射机制动态调用 计算器对象的加法,减法函数。 使用JAVA反射机制修改一个学生对象 的私有数据成员(不允许调用setters) 使用的类有Class, Method, Field
编写Student类,类中包含学生姓名,学号等私有数据成员。 使用JAVA反射机制修改一个学生对象的私有数据成员(不允许调用setters)
Java反射机制,万物皆对象,class也是一个类的对象,通过类类型,反射获得类的成员属性,构造方法,成员方法,并调用类中的方法,也可以调用私有方法。
NULL 博文链接:https://747017186.iteye.com/blog/1935184
Java 反射详解(包含私有方法属性的调用)
Method,invoke,getMethod等反射私有方法和私有属性
java反射机制核心代码,小弟一直弄不明白,怎么通过反射来调用私有成员方法,看了这个后,你可以随心调用private方法,和属性,记得添加setAccessable(true),哦,要不还是不行,如:method.setAccessable(true);
使用Java反射机制动调用计算器的加法,加法函数 使用Java反射机制修改一个学生对象的私有数据成员
Java反射 调用空参方法 调用Object类型参数的方法 调用基本类型参数的方法 调用基本类型数组参数的方法 调用String数组参数的方法 调用Object数组参数的方法 调用私有方法
Java反射访问私有变量和私有方法
(类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) ...(通过反射写一个通用的设置某个对象的某个属性为指定的值) (通过用户的增删改查和学生的登录注册引出中介) (动态代理的概述和实现)
利用java反射机制修改类的私有成员的例子,如果需要了解反射机制的可以参考下。
Java 反射机制详解,适合初学者 1.获取 对象建模类的类型 的方法: 2.获取类中定义的构造方法: 获取类中定义的方法 获取类中定义的属性: 3.获取类实现的接口 4.利用反射实现类: 5.调用私有方法
反射私有内部类的例子 反射私有内部类的例子反射私有内部类的例子
通过引入了Class对象,可以创建拥有私有函数,私有属性,函数实现对外不可见的能力,私有属性以及私有函数只有内部才可以调用
1,写一个类,名为Animal,该类有两个私有属性,name(代表动物的名字),和legs(代表动物的腿的条数);要求为两个私有属性提供public 的访问方法。并提供个两构造方法,一个无参,默认给name赋值为AAA,给legs赋值为4;...
JUnit4利用反射机制测试类的私有成员