java 中反射的使用_java中反射的使用

import java.lang.reflect.*;/*** 反射使用

**/

public classReflectDemo{public static voidmain(String[] args){

ReflectDemo demo= newReflectDemo();

if(args.length == 0){

demo.showClassInfo(null);

}else{

demo.showClassInfo(args[0]);

}

demo.getAndSetPrivateFieldValue();

demo.callPrivateMethod();

}private voidshowClassInfo(String className){

new showReflectionInfo().showClassInfo(className != null && className.length() > 0 ? className : "Test");}/*** 利用反射获取并修改私有域的值

**/

private voidgetAndSetPrivateFieldValue(){try{//利用反射创建实例

Class _testClass = Class.forName("Test");//Class.forName()方法获取Class对象

Object _t = _testClass.newInstance();//使用Class对象.newInstance()创建对象实例

Field _f= Test.class.getDeclaredField("name");

_f.setAccessible(true);//设置私有的域可被访问

Object _value = _f.get(_t); //使用get(Object obj)方法获取私有域的值

System.out.println(_value);//输出 zhangsan

_f.set(_t,"wangwu");//使用set(Object obj, Object newValue)方法修改私有域的值

_value =_f.get(_t);

System.out.println(_value);//输出 wangwu

System.out.println();

}catch(Exception e){

e.printStackTrace();

}

}/*** 利用反射调用其他类的私有方法

**/

private voidcallPrivateMethod(){

Test _t= newTest();

System.out.println(_t.getName());//_t.setName("lisi");//setName为Test类的私有方法,外部不可以直接这样调用//使用反射机制调用Test类的私有方法setName()

Method _m = null;try{//

_m = Test.class.getDeclaredMethod("setName", String.class);/*方法二:使用反射得到setName()方法

Class _cl = _t.getClass();

Method[] _ms = _cl.getDeclaredMethods();

for(int i=0;i<_ms.length>

if(_ms[i].getName().equals("setName")){

_m = _ms[i];

break;

}

}*/_m.setAccessible(true);//不设置可访问权限,会报错java.lang.IllegalAccessException: Class ReflectDemo can not access a member of class Test with modifiers "private"

_m.invoke(_t, "lisi");//invoke表示调用setName()方法,这里m就是setName()方法

}catch(Exception e){

e.printStackTrace();

}

System.out.println(_t.getName());

}

}classTest{private String name = "zhangsan";publicString getName(){returnname;

}private voidsetName(String paramName){

name=paramName;

}

}classshowReflectionInfo{/*** 利用反射分析类的能力

**/

public voidshowClassInfo(String paramClassName){if(paramClassName != null && paramClassName.length() > 0){try{

StringBuilder _sb= new StringBuilder("");

Class _class=Class.forName(paramClassName);

Class _superClass=_class.getSuperclass();

String _modifier=Modifier.toString(_class.getModifiers());if(_modifier != null && _modifier.length() > 0){

_sb.append(_modifier.concat(" "));

}

_sb.append("class ".concat(_class.getName()));if(_superClass != null && _superClass != Object.class){

_sb.append(" extends ".concat(_superClass.getName()));

}

_sb.append(" {\n");

printFields(_sb, _class);

_sb.append("\n");

printConstructors(_sb, _class);

_sb.append("\n");

printMethods(_sb, _class);

_sb.append("}\n");

System.out.println(_sb.toString());

}catch(Exception e){

e.printStackTrace();

}

}

}/*** 打印这个类的所有域

**/

private voidprintFields(StringBuilder paramStringBuilder, Class paramClass){if(paramStringBuilder == null || paramClass == null){return;

}//getDeclaredFields()返回这个类或接口的全部域(含私有域);getFields()返回本类/接口及其所有父类/接口的所有公有域

Field[] _fields =paramClass.getDeclaredFields();

String _modifier= "";for(Field _f:_fields){

paramStringBuilder.append(" ");

_modifier=Modifier.toString(_f.getModifiers());if(_modifier != null && _modifier.length() > 0){

paramStringBuilder.append(_modifier.concat(" "));

}

Class _type=_f.getType();

paramStringBuilder.append(_type.getName().concat(" "));

paramStringBuilder.append(_f.getName().concat(";\n"));

}

}/*** 打印这个类的所有构造方法

**/

private voidprintConstructors(StringBuilder paramStringBuilder, Class paramClass){if(paramStringBuilder == null || paramClass == null){return;

}//getDeclaredConstructors()返回这个类的全部构造方法(含私有的);getConstructors()返回这个类所有公有构造方法

Constructor[] _constructors =paramClass.getDeclaredConstructors();

String _modifier= "";for(Constructor _c:_constructors){

paramStringBuilder.append(" ");

_modifier=Modifier.toString(_c.getModifiers());if(_modifier != null && _modifier.length() > 0){

paramStringBuilder.append(_modifier.concat(" "));

}

paramStringBuilder.append(_c.getName().concat("("));

Class[] _paramTypes=_c.getParameterTypes();int _len =_paramTypes.length;for(int i = 0;i< _len;i++){

paramStringBuilder.append(_paramTypes[i].getName());if(i<_len>

paramStringBuilder.append(",");

}

}

paramStringBuilder.append(");\n");

}

}/*** 打印这个类的所有非构造方法

**/

private voidprintMethods(StringBuilder paramStringBuilder, Class paramClass){if(paramStringBuilder == null || paramClass == null){return;

}//getDeclaredMethods()返回这个类或接口的全部方法(含私有方法);getMethods()返回本类/接口及其所有父类/接口的所有公有方法

Method[] _methods =paramClass.getDeclaredMethods();

String _modifier= "";for(Method _m:_methods){

paramStringBuilder.append(" ");//Modifier中静态方法:Modifier.toString()、Modifier.isAbstract()、Modifier.isPublic()、Modifier.isPrivate()...

_modifier =Modifier.toString(_m.getModifiers());if(_modifier != null && _modifier.length() > 0){

paramStringBuilder.append(_modifier.concat(" "));

}

paramStringBuilder.append(_m.getReturnType().getName().concat(" ").concat(_m.getName()).concat("("));

Class[] _paramTypes=_m.getParameterTypes();int _len =_paramTypes.length;for(int i = 0;i< _len;i++){

paramStringBuilder.append(_paramTypes[i].getName());if(i<_len>

paramStringBuilder.append(",");

}

}

paramStringBuilder.append(");\n");

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值