gpt4 book ai didi

java反射机制示例详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章java反射机制示例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1.什么是反射? 一个类有多个组成部分,例如:成员变量,方法,构造方法等。 反射就是加载类,并解剖出类的各个组成部分。 2.加载类 java中有一个Class类用于代表某一个类的字节码。 Class类既然代表某个类的字节码,那就要提供加载某个类 字节码的方法:forName().   此方法用于加载某个类的字节码 到内存中,并使用class对象进行封装。 另外2种得到class对象的方式: 类名.class 对象.getClass() 。

先创建一个简单的Person类   。

复制代码代码如下:

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类中:

  。

复制代码代码如下:

/** *构造方法 */ 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"); } 。

  。

测试类中:

  。

复制代码代码如下:

//反射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类中:

复制代码代码如下:

/** *方法 */ 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!!!"); } 。

测试类中

复制代码代码如下:

/** *反射类的方法 * *@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类中

  。

复制代码代码如下:

/** *字段 */ 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)),

} 。

  。

其实无论反射构造方法,或者字段都大致相同,我们可以举一反三! 。

最后此篇关于java反射机制示例详解的文章就讲到这里了,如果你想了解更多关于java反射机制示例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com