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));
}
其实无论反射构造方法,或者字段都大致相同,我们可以举一反三!