源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

java反射机制示例详解

  • 时间:2022-08-29 06:02 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:java反射机制示例详解
[b]1.什么是反射? [/b]一个类有多个组成部分,例如:成员变量,方法,构造方法等。 反射就是加载类,并解剖出类的各个组成部分。 [b]2.加载类 [/b]java中有一个Class类用于代表某一个类的字节码。 Class类既然代表某个类的字节码,那就要提供加载某个类 字节码的方法:forName().   此方法用于加载某个类的字节码 到内存中,并使用class对象进行封装。 另外2种得到class对象的方式: 类名.class 对象.getClass() 先创建一个简单的Person类
[u]复制代码[/u] 代码如下:
public class ReflectDemo {  public static void main(String args[]) throws Exception  {  //1.   Class clazz = Class.forName("dsa.Person") ;  //2.  Class clazz1 = new Person().getClass() ;  //3.  Classclazz2=Person.class; } }
3.反射构造方法 Person类中:
[u]复制代码[/u] 代码如下:
/** *构造方法 */ publicPerson(){ System.out.println("null"); } publicPerson(Stringname){ System.out.println(name); } publicPerson(Stringname,intpwd){ System.out.println(name+"+"+pwd); } privatePerson(Listlist){ System.out.println("List"); }
测试类中:
[u]复制代码[/u] 代码如下:
//反射publicPerson() @Test publicvoidtest1()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(null);//获取构造器对象 Personp=(Person)cr.newInstance(null);//通过构造器实例化对象 //System.out.println(p.name); } //反射publicPerson(Stringname) @Test publicvoidtest2()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(String.class); Personp=(Person)cr.newInstance("haha"); System.out.println(p.name); } //反射publicPerson(Stringname,intpwd) @Test publicvoidtest3()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getConstructor(String.class,int.class); Personp=(Person)cr.newInstance("haha",1); //System.out.println(p.name); } //反射publicPerson(Listlist) @Test publicvoidtest4()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Constructorcr=clazz.getDeclaredConstructor(List.class); cr.setAccessible(true);//暴力破解 Personp=(Person)cr.newInstance(newArrayList()); System.out.println(p.name); } //另一种创建对象的途径,只适用于无参的构造方法 @Test publicvoidtest5()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Personp=(Person)clazz.newInstance(); System.out.println(p.name); }
当构造方法是私有的,我们就进行暴力破解!!! 4.反射常规方法 Person类中:
[u]复制代码[/u] 代码如下:
/** *方法 */ publicvoidjf() { } publicvoidjf(Stringname,intpwd) { } publicClass[]jf(Stringname,int[]pwd) { returnnewClass[]{String.class,int.class}; } privatevoidjf(InputStreamin) { System.out.println(in); } publicstaticvoidjf(intnum) { System.out.println(num); } publicstaticvoidmain(Stringargs[]) { System.out.println("main!!!"); }
测试类中:
[u]复制代码[/u] 代码如下:
/** *反射类的方法 * *@authortanlvxu * */ publicclassDemo2{ //反射类的方法:publicvoidjf() @Test publicvoidtest1()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",null); method.invoke(p,null); } //反射类的方法:publicvoidjf(Stringname,intpwd) @Test publicvoidtest2()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",String.class,int.class); method.invoke(p,"dsa",30); } //反射类的方法:publicClass[]jf(Stringname,int[]pwd) @Test publicvoidtest3()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",String.class,int[].class); Classcs[]=(Class[])method.invoke(p,"aads",newint[]{1,2,3}); System.out.println(cs[0]); } //反射类的方法:privatevoidjf(InputStreamin) @Test publicvoidtest4()throwsException{ Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getDeclaredMethod("jf",InputStream.class); method.setAccessible(true); method.invoke(p,newFileInputStream("d:\\qqClient.txt")); } //反射类的方法:publicstaticvoidjf(intnum) @Test publicvoidtest5()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("jf",int.class); method.invoke(null,30); } //反射类的方法:publicstaticvoidm(intnum) @Test publicvoidtest6()throwsException{ Classclazz=Class.forName("RflectorDemo.Person"); Methodmethod=clazz.getMethod("main",String[].class); //method.invoke(null,(Object)newString[]{"ds","das"}); method.invoke(null,newObject[]{newString[]{"ds","das"}}); }
5.反射字段 PerSon类中:
[u]复制代码[/u] 代码如下:
/** *字段 */ publicStringname="swr"; privateintpassword=45; privatestaticintage=35; 测试类中: Java代码 /** *反射类的字段 *@authortanlvxu * */ publicclassDemo3{ /** *反射字段publicStringname="swr"; *@throwsException */ @Test publicvoidtest1()throwsException { Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getField("name"); //获取字段的值 Objectvalue=f.get(p); //获取字段的类型 Classtype=f.getType(); if(type.equals(String.class)){ Stringname=(String)f.get(p); System.out.println(name); } //设置字段的值 f.set(p,"dfafa"); System.out.println(p.name); } /** *反射字段privateintpassword; *@throwsException */ @Test publicvoidtest2()throwsException { Personp=newPerson(); Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getDeclaredField("password"); f.setAccessible(true); f.set(p,36); System.out.println(f.get(p)); } /** *反射字段privatestaticintage=35; *@throwsException */ @Test publicvoidtest3()throwsException { Classclazz=Class.forName("RflectorDemo.Person"); Fieldf=clazz.getDeclaredField("age"); f.setAccessible(true); f.set(null,24); System.out.println(f.get(null)); }
其实无论反射构造方法,或者字段都大致相同,我们可以举一反三!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部