java用反射写一个反编译程序并用io流输出到文本中

代码如下:

package api1_16;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;

public class demo3 {
	
	public static void main(String[] args) throws Exception {
		//定义字符缓冲区存
		StringBuffer sb=new StringBuffer();		
		//获取类对象
		Class cls=Class.forName("java.util.Date");		
		//获取包路径
		Package pname=cls.getPackage();
		/*
		 * 总结: 正斜杠(/)  反斜杆 \ :
		 * */
		sb.append(pname+";"+"\n");
//		System.out.println(pname);
		//获取类的修饰符
		String lssf=Modifier.toString(cls.getModifiers());
		//获取类的名字
		String lname=cls.getSimpleName();		
		sb.append(lssf+" class "+lname);		
		//获取类的父类
		String fl=cls.getSuperclass().getSimpleName();
		sb.append(" extends "+fl);
		//获取所实现的接口	
		Class[] inf=cls.getInterfaces();
		//没有实现任何接口就不要写了
		if(inf.length!=0) {
			sb.append(" implements ");
			for(Class cl:inf) {
				String jk=cl.getSimpleName();
				sb.append(jk);
				sb.append(",");			
			}
			//去除最后的逗号
			sb.deleteCharAt(sb.length()-1);
		}
		
		sb.append("{  ");
		
		//1.获取属性
		Field[] sx=cls.getDeclaredFields();
		for(Field fname:sx) {
			//属性修饰符
			String xxssf=Modifier.toString(fname.getModifiers());
			//属性类型
			String sxlx=fname.getType().getSimpleName();			
			//属性名字
			String sxmz=fname.getName();
			sb.append("\n\t"+xxssf+" "+sxlx+" "+sxmz+";");						
		}
		sb.append("\n");
		//2.获取构造方法
		Constructor[] constructor=cls.getDeclaredConstructors();
		for(Constructor c:constructor) {
			//构造方法修饰符
			Modifier.toString(c.getModifiers());			
			//构造方法名字就是类名
			cls.getSimpleName();			
			//构造方法的参数
			Parameter[] p=c.getParameters();
			/*Parameter  包括其名称和修饰符。 它还提供了获取参数属性的替代方法。 
			 * */
			sb.append("\n\t"+Modifier.toString(c.getModifiers())+" "+cls.getSimpleName());
			sb.append("( ");			
			Class[] s=c.getParameterTypes();
			appCanshu(sb,s,p);
			sb.append(")").append("{ }");			
		}
		sb.append("\n");
		//获取成员方法
		Method[] cyff=cls.getMethods();
		for(Method m:cyff) {
			//方法修饰符
			String ms=Modifier.toString(m.getModifiers());			
			//方法名
			String fm=m.getName();			
			//获得方法的返回值类型
			String flx=m.getReturnType().getSimpleName();		
			//方法的参数
			Parameter[] p=m.getParameters();
			/*Parameter  包括其名称和修饰符。 它还提供了获取参数属性的替代方法。 
			 * */
			//方法三要素
			sb.append("\n\t"+ms+" "+flx+" "+fm);
			sb.append("( ");
			/*getParameterTypes() 
			返回一个 类对象的数组, 类以声明顺序表示由该对象表示的可执行文件的形式参数类型。 
			 * */
			//获取方法的形参class数组
			Class[] c=m.getParameterTypes();			
			//赋上参数
			appCanshu(sb,c,p);
			sb.append(")").append("{ }");
		}	
		sb.append("\n\n  }");
		System.out.println(sb);
		//写数据到文件(out_biany.java)里面去
		BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("out_biany.java"));
		bos.write(sb.toString().getBytes());
		bos.close();
	}
	
	//简化赋参数的方法
	public static void appCanshu(StringBuffer sb,Class[] types,Parameter[] parameters) {
		int num = 0;
        for (int i = 0; i < types.length; i++) {
            sb.append(types[i].getSimpleName());
            sb.append(" ");
            sb.append(parameters[i].getName());
            sb.append(",");
            num++;
        }
        // 删除多余的 ","
        if (num > 0){
            sb.deleteCharAt(sb.length()-1);
        }	
	}

}

效果:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值