sb.append("\t");
Method[] methods = clazz.getMethods();
for(Method method:methods){
Class[] paraClasses = method.getParameterTypes();
sb.append(Modifier.toString(method.getModifiers()));
sb.append(" "+method.getName()+"(");
for(Class paraClass: paraClasses){
sb.append(paraClass.getName()+",");
}
if(null != paraClasses && 0 != paraClasses.length){
sb.deleteCharAt(sb.length()-1);
}
sb.append(")");
sb.append(System.getProperty("line.separator"));
sb.append("\t");
}
}
/**
* 打印运行时类的构造方法。
* @param clazz 运行时类的字节码
* @param sb 打印的内容先用StringBuilder缓存下
*/
private static void printConstructors(Class clazz,StringBuilder sb) {
sb.append("\t");
Constructor[] cons = clazz.getConstructors();
for(Constructor con : cons){
String conModifier = Modifier.toString(con.getModifiers());
sb.append(conModifier);
sb.append(" "+con.getName()+"(");
Class[] types = con.getParameterTypes();
for(Class type:types){
sb.append(type.getName()+",");
}
if(null!=types && 0 !=types.length){
sb.deleteCharAt(sb.length()-1); //删除最后一个逗号,字符
}
sb.append(")");
sb.append(System.getProperty("line.separator"));
sb.append("\t");
}
/**
* 测试反射运行时得到的方法及变量,如何调用,如何设置值。
*/
private static void applyReflectChangeObjValDemo() {
ReflectDemo rd = new ReflectDemo();
Method m1 = null ;
try{
Class lc = rd.getClass();
m1 = lc.getMethod("setName", String.class); //setName方法,有参数参数是String的。
Boolean b = (Boolean)m1.invoke(rd, "four");
System.out.println("---------------:"+rd.getName());
rd.setSize(21);
m1 = lc.getMethod("getSize");
Integer size = (Integer)m1.invoke(rd); //getSize方法返回int,没有参数。
System.out.println("Size大小::"+size);
m1 = lc.getMethod("getPI");
Double d = (Double)m1.invoke(null); //静态方法,无参数且返回为double,静态方法第一个参数肯定是null,第二参数若无参数则空起来即可。
System.out.println("PI的值为::"+d.doubleva lue());
Field f = lc.getDeclaredField("pos"); //私有的成员变量,反射想拿到的话,必须用getDeclaredField
f.setAccessible(true); //私有的成员变量,反射想访问的话,必须setAccessible为true
int value = 88;
f.set(rd, value);
System.out.println("------pos为---"+rd.getPos());
f.set(rd, size);
System.out.println("-----恢复pos后为---"+rd.getPos());
rd.setName("sdfasdf");
f = lc.getField("name");
System.out.println("------------name的值为-------::"+f.get(rd));
f.set(rd, "zhangsan");
System.out.println("------------name的值为-------::"+f.get(rd));
}catch(Exception e){
e.printStackTrace();
System.out.println("异常了-------------------