手机
当前位置:查字典教程网 >编程开发 >Java >java反射机制示例详解
java反射机制示例详解
摘要:1.什么是反射?一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。2.加载类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中关于内部类的使用详解

Java读写文件创建文件夹多种方法示例详解

java读取大文件简单实例

深入java垃圾回收的详解

java多线程详细总结

深入Java不可变类型的详解

深入Java冒泡排序与选择排序的区别详解

java 抽象类和接口的区别详细解析

java字符串反转示例分享

java运行shell脚本方法示例

精品推荐
分类导航