java反射深入剖析改变private方法的简单实例资料.docx

上传人:b****0 文档编号:283481 上传时间:2022-10-08 格式:DOCX 页数:11 大小:20.89KB
下载 相关 举报
java反射深入剖析改变private方法的简单实例资料.docx_第1页
第1页 / 共11页
java反射深入剖析改变private方法的简单实例资料.docx_第2页
第2页 / 共11页
java反射深入剖析改变private方法的简单实例资料.docx_第3页
第3页 / 共11页
java反射深入剖析改变private方法的简单实例资料.docx_第4页
第4页 / 共11页
java反射深入剖析改变private方法的简单实例资料.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

java反射深入剖析改变private方法的简单实例资料.docx

《java反射深入剖析改变private方法的简单实例资料.docx》由会员分享,可在线阅读,更多相关《java反射深入剖析改变private方法的简单实例资料.docx(11页珍藏版)》请在冰豆网上搜索。

java反射深入剖析改变private方法的简单实例资料.docx

java反射深入剖析改变private方法的简单实例资料

java反射深入剖析改变private方法的简单实例

classDemoTest{privateStringname="123";publicgetName(){system.out.println("publicgetName"+name);returnname;}privategetName2(){system.out.println("privategetName2"+name);returnname;}}

如这个,要改变name的值。

如何改变。

通过java反射如何改变

先来看看如何用反射来调用getName方法

classcalzz=DemoTest.class;Constructorcons=clazz.getConstructor(newclass[]{});//这个是得到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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1