java反射深入剖析改变private方法的简单实例资料.docx
- 文档编号:283481
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:11
- 大小:20.89KB
java反射深入剖析改变private方法的简单实例资料.docx
《java反射深入剖析改变private方法的简单实例资料.docx》由会员分享,可在线阅读,更多相关《java反射深入剖析改变private方法的简单实例资料.docx(11页珍藏版)》请在冰豆网上搜索。
java反射深入剖析改变private方法的简单实例资料
java反射深入剖析改变private方法的简单实例
classDemoTest{privateStringname="123";publicgetName(){system.out.println("publicgetName"+name);returnname;}privategetName2(){system.out.println("privategetName2"+name);returnname;}}
如这个,要改变name的值。
如何改变。
通过java反射如何改变
先来看看如何用反射来调用getName方法
class
参数为构造方法的参数的类的对象。
如:
DemoTest有一个构造方法为publicDemoTest(Stringarg0,Stringarg1){......}
这时,Constructorcons=clazz.getConstructor(newclass[]{String.class,String.class});两个String.calss分别对应arg0,arg1.
接下来是:
DemoTesttest=(DemoTest)cons.newInstance(newObject[]{});//生成相应的对象。
参数newObject[]{}就是构造方法对应的参数的具体值。
如刚才的:
DemoTesttest=(DemoTest)cons.newInstance(newObject[]{“李车”,"张三"});
接下来:
Methodmethod=clazz.getMethod("getName",newClass[]{String.class});method.invoke(test,newObject[]{"王五"});
这时就可以打印出王五了。
那要如何把name为private的值进行改变呢。
1。
先得到field,
Fieldfield=clazz.getDeclaredField("name");
2.将此对象的accessible标志设置为指示的布尔值。
值为true则指示反射的对象在使用时应该取消Java语言访问检查。
值为false则指示反射的对象应该实施Java语言访问检查。
field.setAccessible(true);
3.对变量值进行修改
field.set("name","王五");
OK;
要访问私有的方法也是一样。
Methodmethod=clazz.getDeclaredMethod("getName2");method.setAccessible(true);method.invoke(test,newObject[]{"王五"});
用getDeclaredFields就能得到private和publicprotendprotected的字段
如果用c.getFields();只能得到public类型的属性
我们知道,Java应用程序不能访问持久化类的private方法,但Hibernate没有这个限制,它能够访问各种级别的方法,如private,default,protected,public.Hibernate是如何实现该功能的呢?
答案是利用JAVA的反射机制,如下:
importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;publicclassReflectDemo{publicstaticvoidmain(String[]args)throwsException{Methodmethod=PackageClazz.class.getDeclaredMethod("privilegedMethod",newClass[]{String.class,String.class});method.setAccessible(true);method.invoke(newPackageClazz(),"452345234","q31234132");}}classPackageClazz{privatevoidprivilegedMethod(StringinvokerName,Stringadb){System.out.println("---"+invokerName+"----"+adb);}}
输出结果为:
---452345234----q31234132
我们看到,利用java的反射机制,即使是private方法,也可以被调用使用.不过我到产生一个疑问--即然private方法都可以被调用,那么封装又有何意义?
【案例1】通过一个对象获得完整的包名和类名
packageReflect;/***通过一个对象获得完整的包名和类名**/classDemo{//othercodes...}classhello{publicstaticvoidmain(String[]args){Demodemo=newDemo();System.out.println(demo.getClass().getName());}}
【运行结果】:
Reflect.Demo
添加一句:
所有类的对象其实都是Class的实例。
【案例2】实例化Class类对象
packageReflect;classDemo{//othercodes...}classhello{publicstaticvoidmain(String[]args){Class
>demo1=null;Class
>demo2=null;Class
>demo3=null;try{//一般尽量采用这种形式demo1=Class.forName("Reflect.Demo");}catch(Exceptione){e.printStackTrace();}demo2=newDemo().getClass();demo3=Demo.class;System.out.println("类名称"+demo1.getName());System.out.println("类名称"+demo2.getName());System.out.println("类名称"+demo3.getName());}}
【运行结果】:
类名称Reflect.Demo
类名称Reflect.Demo
类名称Reflect.Demo
【案例3】通过Class实例化其他类的对象
通过无参构造实例化对象
publicPerson(Stringname,intage){this.age=age;this.name=name;}
然后继续运行上面的程序,会出现:
所以大家以后再编写使用Class实例化其他类的对象的时候,一定要自己定义无参的构造函数
【案例】通过Class调用其他类中的构造函数(也可以通过这种方式通过Class创建其他类的对象)
packageReflect;importjava.lang.reflect.Constructor;classPerson{publicPerson(){}publicPerson(Stringname){this.name=name;}publicPerson(intage){this.age=age;}publicPerson(Stringname,intage){this.age=age;this.name=name;}publicStringgetName(){returnname;}publicintgetAge(){returnage;}@OverridepublicStringtoString(){return"["+this.name+""+this.age+"]";}privateStringname;privateintage;}classhello{publicstaticvoidmain(String[]args){Class
>demo=null;try{demo=Class.forName("Reflect.Person");}catch(Exceptione){e.printStackTrace();}Personper1=null;Personper2=null;Personper3=null;Personper4=null;//取得全部的构造函数Constructor
>cons[]=demo.getConstructors();try{per1=(Person)cons[0].newInstance();per2=(Person)cons[1].newInstance("Rollen");per3=(Person)cons[2].newInstance(20);per4=(Person)cons[3].newInstance("Rollen",20);}catch(Exceptione){e.printStackTrace();}System.out.println(per1);System.out.println(per2);System.out.println(per3);System.out.println(per4);}}
【运行结果】:
[null0]
[Rollen0]
[null20]
[Rollen20]
【案例】
返回一个类实现的接口:
packageReflect;interfaceChina{publicstaticfinalStringname="Rollen";publicstaticintage=20;publicvoidsayChina();publicvoidsayHello(Stringname,intage);}classPersonimplementsChina{publicPerson(){}publicPerson(Stringsex){this.sex=sex;}publicStringgetSex(){returnsex;}publicvoidsetSex(Stringsex){this.sex=sex;}@OverridepublicvoidsayChina(){System.out.println("hello,china");}@OverridepublicvoidsayHello(Stringname,intage){System.out.println(name+""+age);}privateStringsex;}classhello{publicstaticvoidmain(St
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 反射 深入 剖析 改变 private 方法 简单 实例 资料