java动态编程,java如何编程一个一维动态数组

1,java如何编程一个一维动态数组楼上的,Js与Java根本就不是一回事,JAVA中没有动态的数组如果有类似动态数组的需求,要用集合类来实现,如ArrayList或Vector类具体的可以搜索这两个类的使用.JS的数组本身就是动态的: vara=newArray(); a[0]=1;
2,如何在java中动态执行一段代码有点难度, ,  , ,,需要动态编译成类、、、、然后反射调用首先你可以使用输入输出流(或者你说的可能是要用反射得到程序结果来解析)解析做出*.java文件 。然后可以使用runtime调用dos下的java编译命令编译取得class文件 。然后使用classloader,反射等组合执行生成的class文件 。
3,Java动态生成代码可以的,我说说大概思路 , 很简单,你自己具体实现吧,把代码写给你没意义的:1.将你这段字符串输出到一个文件里,用Java类文件的方式命名 。2.调用外部javac命令将该文件编译 。3.用类加载器(ClassLoad)动态加载新的class文件并用Class.forName()注册该类 , 然后就可以正常使用了 。上面的每一步都能在baidu中找到实现方法,自己发挥吧 。代码需要经过编译才能执行 。你的问题我不太明白,可以把要分开的代码打成不同的包,然后通过exec() 这样的调用 。如果你是想直接执行这些代码是不可能的 。为什么不用 if else 【java动态编程,java如何编程一个一维动态数组】
4,在java代码中实现动态编译java文件import javax.tools.*;import java.io.*;/** * @author hardneedl */final public class MyCompile /** * @param args 命令行参数只有1个,即待编译的源代码文件的绝对路径 * @throws FileNotFoundException */ public static void main(String... args) throws FileNotFoundException JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int r = compiler.run(null,null,null,args[0]); System.out.println(r == 0? "成功":"失败"); }}5 , java 动态代理怎么理解JAVA的静态代理与动态代理比较 一、概念代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等 。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务 。按照代理类的创建时期,代理类可分为两种 。静态代理类:由程序员创建或由特定工具自动生成源代码,再对其编译 。在程序运行前,代理类的.class文件就已经存在了 。动态代理类:在程序运行时,运用反射机制动态创建而成 。二、静态代理类如下,HelloServiceProxy 类是代理类,HelloServiceImpl类是委托类,这两个类都实现了HelloService接口 。其中HelloServiceImpl类是HelloService接口的真正实现者,而HelloServiceProxy类是通过调用HelloServiceImpl 类的相关方法来提供特定服务的 。HelloServiceProxy类的echo()方法和getTime()方法会分别调用被代理的HelloServiceImpl 对象的echo()方法和getTime()方法,并且在方法调用前后都会执行一些简单的打印操作 。由此可见,代理类可以为委托类预处理消息、把消息转发给委托类和事后处理消息等 。例程1 HelloService.javapackage proxy;import java.util.Date;public interface HelloServicepublic String echo(String msg);public Date getTime();}例程2 HelloServiceImpl.javapackage proxy;import java.util.Date;public class HelloServiceImpl implements HelloServicepublic String echo(String msg)return "echo:"+msg;}public Date getTime()return new Date();}}例程3 HelloServiceProxy.javapackage proxy;import java.util.Date;public class HelloServiceProxy implements HelloServiceprivate HelloService helloService; //表示被代理的HelloService 实例public HelloServiceProxy(HelloService helloService)this.helloService=helloService;}public void setHelloServiceProxy(HelloService helloService)this.helloService=helloService;}public String echo(String msg)System.out.println("before calling echo()"); //预处理String result=helloService.echo(msg); //调用被代理的HelloService 实例的echo()方法System.out.println("after calling echo()"); //事后处理return result;}public Date getTime()System.out.println("before calling getTime()"); //预处理Date date=helloService.getTime(); //调用被代理的HelloService 实例的getTime()方法System.out.println("after calling getTime()"); //事后处理return date;}}在Client1 类的main()方法中 , 先创建了一个HelloServiceImpl对象,又创建了一个HelloServiceProxy对象,最后调用HelloServiceProxy对象的echo()方法 。例程4 Client1.javapackage proxy;public class Client1public static void main(String args[])HelloService helloService=new HelloServiceImpl();HelloService helloServiceProxy=new HelloServiceProxy(helloService);System.out.println(helloServiceProxy.echo("hello"));}}运行Client1 类,打印结果如下:before calling echo()after calling echo()echo:hello例程3 的HelloServiceProxy 类的源代码是由程序员编写的 , 在程序运行前,它的.class文件就已经存在了,这种代理类称为静态代理类 。三、动态代理类与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码 。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类 。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力 。Proxy类提供了创建动态代理类及其实例的静态方法 。(1)getProxyClass()静态方法负责创建动态代理类,它的完整定义如下:public static Class getProxyClass(ClassLoader loader, Class[] interfaces) throws IllegalArgumentException参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口 。(2)newProxyInstance()静态方法负责创建动态代理类的实例,它的完整定义如下:public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler) throws IllegalArgumentException参数loader 指定动态代理类的类加载器,参数interfaces 指定动态代理类需要实现的所有接口 , 参数handler 指定与动态代理类关联的 InvocationHandler 对象 。以下两种方式都创建了实现Foo接口的动态代理类的实例:/**** 方式一 ****///创建InvocationHandler对象InvocationHandler handler = new MyInvocationHandler(...);//创建动态代理类Class proxyClass = Proxy.getProxyClass(Foo.class.getClassLoader(), new Class[] //创建动态代理类的实例Foo foo = (Foo) proxyClass.getConstructor(new Class[] newInstance(new Object[] /**** 方式二 ****///创建InvocationHandler对象InvocationHandler handler = new MyInvocationHandler(...);//直接创建动态代理类的实例Foo foo = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class[] 由Proxy类的静态方法创建的动态代理类具有以下特点:动态代理类是public、final和非抽象类型的;动态代理类继承了java.lang.reflect.Proxy类;动态代理类的名字以“$Proxy”开头;动态代理类实现getProxyClass()和newProxyInstance()方法中参数interfaces指定的所有接口;Proxy 类的isProxyClass(Class cl)静态方法可用来判断参数指定的类是否为动态代理类 。只有通过Proxy类创建的类才是动态代理类;动态代理类都具有一个public 类型的构造方法 , 该构造方法有一个InvocationHandler 类型的参数 。由Proxy类的静态方法创建的动态代理类的实例具有以下特点:1. 假定变量foo 是一个动态代理类的实例,并且这个动态代理类实现了Foo 接口,那么“foo instanceof Foo”的值为true 。把变量foo强制转换为Foo类型是合法的:(Foo) foo //合法2.每个动态代理类实例都和一个InvocationHandler 实例关联 。Proxy 类的getInvocationHandler(Object proxy)静态方法返回与参数proxy指定的代理类实例所关联的InvocationHandler 对象 。3.假定Foo接口有一个amethod()方法 , 那么当程序调用动态代理类实例foo的amethod()方法时,该方法会调用与它关联的InvocationHandler 对象的invoke()方法 。InvocationHandler 接口为方法调用接口,它声明了负责调用任意一个方法的invoke()方法:Object invoke(Object proxy,Method method,Object[] args) throws Throwable参数proxy指定动态代理类实例,参数method指定被调用的方法,参数args 指定向被调用方法传递的参数 , invoke()方法的返回值表示被调用方法的返回值 。四、最后看一个实例:HelloServiceProxyFactory 类的getHelloServiceProxy()静态方法负责创建实现了HelloService接口的动态代理类的实例 。例程5 HelloServiceProxyFactory.javapackage proxy;import java.lang.reflect.*;public class HelloServiceProxyFactory /** 创建一个实现了HelloService 接口的动态代理类的实例* 参数helloService 引用被代理的HelloService 实例*/public static HelloService getHelloServiceProxy(final HelloService helloService)//创建一个实现了InvocationHandler接口的匿名类的实例InvocationHandler handler=new InvocationHandler()public Object invoke(Object proxy,Method method,Object args[])throws ExceptionSystem.out.println("before calling "+method); //预处理Object result=method.invoke(helloService,args);//调用被代理的HelloService 实例的方法System.out.println("after calling "+method); //事后处理return result;}};Class classType=HelloService.class;return (HelloService)Proxy.newProxyInstance(classType.getClassLoader(),new Class[]handler);}}如下所示的Client2 类先创建了一个HelloServiceImpl 实例,然后创建了一个动态代理类实例helloServiceProxy,最后调用动态代理类实例的echo()方法 。例程6 Client2.javapackage proxy;public class Client2public static void main(String args[])HelloService helloService=new HelloServiceImpl();HelloService helloServiceProxy=HelloServiceProxyFactory.getHelloServiceProxy(helloService);System.out.println("动态代理类的名字为"+helloServiceProxy.getClass().getName());System.out.println(helloServiceProxy.echo("Hello"));}}运行Client2,打印结果如下:动态代理类的名字为$Proxy0before calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)after calling public abstract java.lang.String proxy.HelloService.echo(java.lang.String)echo:Hello从结果看出 , 动态代理类的名字为$Proxy0 。PostScript人家是动态编程,需要在原来的方法的功能基础上再添加一些功能,而不用改变这个方法的签名,原来调用这个方法的类依然能正常工作 。比如,现在要把一段文本发送给另一个人 , 普通方法是 void send(file a),现在我们弄出个特性,就像 spring aop 那样,在 send 之前给这个 a 压缩一下 。原来的程序没有压缩功能,现在我们需要添加的话而不改变原来所有的代码的话就得用类似 aop 这样的代码来处理 。一般一个无法再继承的类和方法,要用代理 , 而能够继承的类和方法可以在内在中直接生成一个新的 java 类继承它然后覆盖掉那个 send 方法,像 hibernate/spring/jboss 都把这些自动完成了 。而像 aspectj 这种 aop 刚不同,它直接把人家的 class 代码修改了 , 它就不需要使用代理 。这些在新的 jdk 6 中都可以通过 instrument 来做到,不过也是个通用的方法,还得通过规则来定制什么情况下处理 , 什么时候不处理 。

    推荐阅读