扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
可以的,只是需要new一个自身就可以了..看代码演示吧!
成都创新互联-专业网站定制、快速模板网站建设、高性价比额济纳网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式额济纳网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖额济纳地区。费用合理售后完善,十多年实体公司更值得信赖。
public class 静态
{
//非静态变量;
private int m=10;
public static void main(String[] args)
{
System.out.println("\n\t\t为什么Java里的静态方法没办法调用动态方法和变量\n\n");
init();
}
//这个是静态方法!
private static void init()
{
//开始调用!
new 静态().show();
}
//这个是非静态方法!
private void show()
{
System.out.println("\n我是非静态方法,我调用了非静态的变量:m="+m+"\n\n");
}
}
class Demo
{
public static void main(String[] args)
{
new Bean().show1();/*在这里动态的调用show1,show2,也就是说更具传来的参数不同动态的调用不同的方法。if和反射都能实现,但是if重复代码太多,感觉不舒服(不是指这个Demo)。*/
}
}
class Bean
{
void show1()
{}
void show2()
{}
}
1.Java动态加载类和静态加载类的区别
new创建对象的方式称作为静态加载,而使用Class.forName("XXX")称作为动态加载,它们俩本质的区别在于静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序不必存在)。
2.为什么需要动态加载类
对于我自己的理解,动态加载类增加了程序的灵活性。比如一个程序中有50个功能,但你可能只会使用其中的一个,如果你用的是静态加载的方式,你必须在编译前提供100个功能的所有定义,否则无法编译通过,若你使用的是动态加载机制,则不需要如此大费周章,用哪一个就定义哪一个即可。
静态加载:
public class Office_Static {
public static void main(String[] args) {
//new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类
if("Word".equals(args[0])){
Word w = new Word();
w.start();
}
if("Excel".equals(args[0])){
Excel e = new Excel();
e.start();
}
}
}
这个程序编译时必须有Word和Excel这两个类存在才行,即使判断后用不到Excel也要加载
动态加载:
接口OfficeAble :
public interface OfficeAble {
public void start();}
可以的,我说说大概思路,很简单,你自己具体实现吧,把代码写给你没意义的:
1.将你这段字符串输出到一个文件里,用Java类文件的方式命名。
2.调用外部javac命令将该文件编译。
3.用类加载器(ClassLoad)动态加载新的class文件并用Class.forName()注册该类,然后就可以正常使用了。
上面的每一步都能在baidu中找到实现方法,自己发挥吧。
首先你可以使用输入输出流(或者你说的可能是要用反射得到程序结果来解析)解析做出*.Java文件。
然后可以使用runtime调用Dos下的java编译命令编译取得class文件。
然后使用classloader,反射等组合执行生成的class文件。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流