动态编译实例


import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;

public class SelectPlace {

  String   city1[]   =   {"东城","西城","崇文","宣武","朝阳","海淀","丰台","石景山","门头沟","房山","通州","顺义","昌平","大兴","平谷","怀柔","密云","其它"};  
  String   city2[]   =   {"黄浦","卢湾","徐汇","长宁","静安","普陀","闸北","虹口","杨浦","宝山","闵行","嘉定","浦东新","松江","金山","青浦","南汇","奉贤","崇明","其它"};  
    String   city3[]   =   {"和平","河东","河西","南开","河北","红桥","塘沽","汉沽","大港","东丽","西青","北辰","津南","武清","宝坻","静海","宁河","蓟县","其它"};  
    String   city4[]   =   {"渝中","大渡口","江北","沙坪坝","九龙坡","南岸","北碚","万盛","双桥","渝北","巴南","万州","涪陵","黔江","永川","合川","江津","南川","长寿","綦江","潼南","荣昌","璧山","大足","铜梁","梁平","城口","垫江","武隆","丰都","奉节","开县","云阳","忠县","巫溪","巫山","石柱","秀山","酉阳","彭水"};  
    String   city5[]   =   {"哈尔滨","齐齐哈尔","鹤岗","双鸭山","鸡西","佳木斯","七台河","黑河","牡丹江","大庆","绥芬河","尚志","伊春","其它"};  
    String   city6[]   =   {"长春","吉林","抚松","龙井","梅河口","四平","辽源","通化","延吉","集安","大安","浑江","白山","松原","白城","延边","其它"};  
    String   city7[]   =   {"沈阳","大连","鞍山","本溪","丹东","抚顺","锦州","葫芦岛","辽阳","营口","盘锦","阜新","朝阳","铁岭","东港","其它"};  
    String   city8[]   =   {"呼和浩特","包头","乌海","赤峰","通辽","鄂尔多斯","乌兰察布","呼伦贝尔","满洲里","海拉尔","乌兰浩特","锡林浩特","东胜","其它"};  
    String   city9[]   =   {"乌鲁木齐","哈密","伊犁","喀什","石河子","库尔勒","和田","克拉玛依","奎屯","昌吉","博乐","吐鲁番","阿勒泰","其它"};  
    String   city10[]   =   {"兰州","敦煌","天水","金昌","白银","武威","嘉峪关","酒泉","定西地区","平凉地区","庆阳地区","陇南地区","张掖地区","甘南州","临夏州","其它"};  
    String   city11[]   =   {"西宁","海南州","黄南自治州","湟中县","格尔木","贵德县","尖扎县","乌兰县","其它"};  
    String   city12[]   =   {"西安","铜川","延安","宝鸡","韩城","汉中","咸阳","渭南","华阴","榆林","安康","其它"};  
    String   city13[]   =   {"太原","大同","侯马","阳泉","五台山","运城","长治","晋城","晋中","朔州","忻州","临汾","其它"};  
    String   city14[]   =   {"济南","青岛","烟台","泰安","威海","蓬莱","曲阜","潍坊","淄博","德州","临沂","日照","荣城","文登","枣庄","聊城","荷泽","莱阳","莱州","龙口","济宁","东营","滨州","其它"};  
    String   city15[]   =   {"成都","攀枝花","绵阳","乐山","九寨沟","江油","南充","宜宾","自贡","泸州","内江","德阳","雅安","广元","遂宁","广安","达州","巴中","眉山","资阳","其它"};  
    String   city16[]   =   {"贵阳","安顺","遵义","六盘水","铜仁地区","毕节地区","黔西南","黔东南","黔南","其它"};  
    String   city17[]   =   {"昆明","曲靖","大理","丽江","西双版纳","楚雄","红河州","景洪","瑞丽","玉溪","保山","昭通","个旧","怒江","其它"};  
    String   city18[]   =   {"南宁","桂林","北海","柳州","梧州","衡阳","玉林","防城港","钦州","其它"};  
    String   city19[]   =   {"广州","深圳","珠海","佛山","汕头","中山","湛江","江门","肇庆","东莞","顺德","南海","三水","新会","惠州","潮阳","潮州","从化","番禺","茂名","梅州","河源","开平","普宁","清远","韶关","台山","阳江","化州","雷州","四会","云浮","其它"};  
    String   city20[]   =   {"长沙","岳阳","衡阳","株洲","郴州","怀化","常德","大庸","张家界","邵阳","湘潭","韶山","永州","娄底","其它"};  
    String   city21[]   =   {"武汉","黄石","十堰","襄樊","宜昌","荆州","鄂州","沙市","神农架","随州","孝感","黄冈","大冶","咸宁","恩施","荆门","洪湖","仙桃","其它"};  
    String   city22[]   =   {"南昌","九江","景德镇","鹰潭","赣州","丰城","抚州","庐山","萍乡","上饶","新余","吉安","宜春","其它"};  
    String   city23[]   =   {"杭州","宁波","温州","嘉兴","绍兴","金华","台州","丽水","舟山","衢州","湖州","义乌","其它"};  
    String   city24[]   =   {"南京","苏州","南通","扬州","徐州","连云港","常州","无锡","常熟","张家港","宜兴","盐城","江阴","丹阳","高邮","淮阴","江都","昆山","泰州","吴江","锡山","镇江","扬中","启东","太仓","靖江","宿迁","其它"};  
    String   city25[]   =   {"合肥","黄山","芜湖","铜陵","安庆","蚌埠","马鞍山","淮北","宣城地区","青阳","淮南","滁州","宣州地区","宁国","东港","阜阳","宿州","巢湖","六安","池州","其它"};  
    String   city26[]   =   {"福州","厦门","三明","泉州","漳州","晋江","莆田","武夷山","石狮","南平","宁德","福清","福安","龙岩","南安","其它"};  
    String   city27[]  =   {"海口","三亚","通什","文昌","昌江","琼海","万宁","五指山","儋州","其它"};  
    String   city28[]   =   {"郑州","开封","洛阳","三门峡","平顶山","新乡","南阳","安阳","登封","焦作","汝州","商丘","许昌","周口","益州","禹州","项城","鹤壁","濮阳","漯河","驻马店","偃师","其它"};  
    String   city29[]  =   {"石家庄","张家口","秦皇岛","保定","沧州","承德","衡水","任丘","任邱","廊坊","唐山","邯郸","衡水","清河县","邢台","其它"};  
    String   city30[]  =   {"银川","中卫","石嘴山","吴忠","固原","其它"};  
    String   city31[]   =   {"拉萨","日喀则地区","那曲地区","山南地区","昌都地区","山南地区","阿里地区","其它"};  
    String   city32[]   =   {"澳门","其它"};  
    String   city33[]  =   {"中西","东区","九龙城","观塘","南区","深水","湾仔","黄大仙","油尖旺","离岛","葵青","北区","西贡","沙田","屯门","大埔","荃湾","元朗","其它"};  
    String   city34[]  =   {"台北","高雄","基隆","台中","台南","新竹","嘉义","台北","宜兰","新竹","桃园","苗栗","台中县","彰化县","南投县","嘉义县","云林县","台南县","高雄县","屏东县","台东县","花莲县","澎湖县","其它"};  
    String   city35[]  =   {"其它"}; 
     
    String   provinceName[]   =   {"北京","上海","天津","重庆","黑龙江","吉林","辽宁","内蒙古","新疆","甘肃","青海","陕西","山西","山东","四川","贵州","云南","广西","广东","湖南","湖北","江西","浙江","江苏","安徽","福建","海南","河南","河北","宁夏","西藏","澳门","香港","台湾","其它"};
 


 public static void main(String[] args)throws Exception{
  Object str=new SelectPlace().eval(2);
  String a[]=(String[])str;
  for(int i=0;i<a.length;i++){
   System.out.println(a[i]);
  }
 }
 public static void debuge(String info){
  System.out.println(info);
 }
 
 
 public  Object eval(int i)throws Exception{ 
 String s="class Temp{";
 s+="public static Object rt(){";
 s+="SelectPlace sp=new SelectPlace();";
 s+="return sp.city"+i+";";
 s+="/n}";
 s+="}";
 File f; 
 f=File.createTempFile("JavaRuntime",".java",new File(System.getProperty("user.dir")));
 f.deleteOnExit();
 String fileName=f.getName();
 
 PrintWriter out=new PrintWriter(new FileOutputStream(f));
 out.println(s);
 out.flush();
 out.close();
 final com.sun.tools.javac.Main javac=new com.sun.tools.javac.Main();
 String[] arg=new String[]{"-d",System.getProperty("user.dir"),fileName};

 
 int status=javac.compile(arg);
 if(status!=0){
  debuge("没有编译成功");
  return null;
 }else{debuge("ok");}
 Class className=Class.forName("Temp"); 
 Method rt=className.getMethod("rt",new  Class[]{});
 return rt.invoke(null,null);//运行并返回值   

}

-------------------------------------------------------------------------------------------------------------------------

rt.invoke(null,null);//

第一个参数,当rt函数为static时使用.

第二个是rt的形参个数

class的getMethod()

public Method getMethod(String name,
                        Class... parameterTypes)
                 throws NoSuchMethodException,
                        SecurityException
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 name 参数是一个 String,用于指定所需方法的简称。 parameterTypes 参数是按声明顺序标识该方法形式参数类型的 Class 对象的一个数组。如果 parameterTypesnull,则按空数组处理。

如果 name 是 "<init>" 或 "<clinit>",则将引发 NoSuchMethodException。否则,要反映的方法由下面的算法确定(设 C 为此对象所表示的类):

  1. 在 C 中搜索任一匹配的方法。如果找不到匹配的方法,则将在 C 的超类上递归调用第 1 步算法。
  2. 如果在第 1 步中没有找到任何方法,则在 C 的超接口中搜索匹配的方法。如果找到了这样的方法,则反映该方法。
在 C 类中查找匹配的方法:如果 C 正好声明了一个具有指定名称的公共方法并且恰恰有相同的形式参数类型,则它就是反映的方法。如果在 C 中找到了多个这样的方法,并且其中有一个方法的返回类型比其他方法的返回类型都特殊,则反映该方法;否则将从中任选一个方法。

程序在Eclipse下编译成功,但是不能在其中运行,只能用java命令运行,可能是Eclipse路径的问题

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值