Topic: 突然想到:是否可以在运行期动态的创建一个未知类?

  Print this page

1.突然想到:是否可以在运行期动态的创建一个未知类? Copy to clipboard
Posted by: jfml
Posted on: 2003-04-18 19:22

呵呵,不是一般的反射

而是在编译期根本不存在这个类

环境中也没有

是根据运行期的一些数据来确定这个的属性和方法

构造出来的“未知类”

要是Java能这么做就爽了

2.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: memphisguo
Posted on: 2003-04-18 19:41

当然可以!我以前做过一个
jdk本身就有一个开发包,好象是sun.什么了,查查资料

3.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-18 20:22

有吗

我用Java时间也8短了

没怎么听到过阿

哪位达人帮忙找找

4.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 11:10

高人在哪里,进来看看

5.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: rainman
Posted on: 2003-04-19 11:19

BCEL可以满足你的一点小要求。

http://jakarta.apache.org/bcel/manual.html

6.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 11:26

请问达人

一定要third party的么

J2SE目前版本是不是暂时没有这种特性阿?

7.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: floater
Posted on: 2003-04-19 13:01

java.lang.Compiler

8.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 13:13

它行么?总版主能给个简单的例子么?非常感谢

java.lang
Class Compiler
java.lang.Object
|
+--java.lang.Compiler

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

public final class Compiler
extends Object
The Compiler class is provided to support Java-to-native-code compilers and related services. By design, the Compiler class does nothing; it serves as a placeholder for a JIT compiler implementation.

When the Java Virtual Machine first starts, it determines if the system property java.compiler exists. (System properties are accessible through getProperty and , a method defined by the System class.) If so, it is assumed to be the name of a library (with a platform-dependent exact location and type); the loadLibrary method in class System is called to load that library. If this loading succeeds, the function named java_lang_Compiler_start() in that library is called.

If no compiler is available, these methods do nothing.

Since:
JDK1.0
See Also:
System.getProperty(java.lang.String), System.getProperty(java.lang.String, java.lang.String), System.loadLibrary(java.lang.String)

9.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: Jove
Posted on: 2003-04-19 13:21

另一种思路是代码自动生成
临时生成一个.java文件,进行编译
类似jsp-->servlet的方式

10.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 13:39

代码自动生成也可以,但是可能会有安全障碍

不知道J2SE目前是不是真的可以在运行期“凭空捏造”捏造出类来

请大虾们继续关注阿

11.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: terry39
Posted on: 2003-04-19 16:01

我有一个主意:
读配置文件,取得需要创建的类的名字 的 字符串
用classloader来做

看看:http://www-900.ibm.com/developerWorks/cn/java/l-classload/index.shtml

我不太理解的是:
能动态加载类 如何调用这个动态类的方法? ...

12.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 16:54

呵呵 楼上的

你那是简单的反射

不是我说的 ” 凭空捏造 “ 一个类出来

13.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-19 17:06

看来这个问题蛮深的啊,
如果真的在技术上可行的话
建议版主帮忙置顶,做一个热门话题吧

14.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: floater
Posted on: 2003-04-19 23:44

CrazyJavar wrote:
呵呵,不是一般的反射

而是在编译期根本不存在这个类

环境中也没有

是根据运行期的一些数据来确定这个的属性和方法

构造出来的“未知类”

要是Java能这么做就爽了

There is no technical difficulty. At runtime, if you want to create a new java file, just write you code into a text file and put it in the right location. Then call Compiler to compile it. Check the src code for ANT build tool, for example. I have done that a long time ago(4 years ago?), so don't have old code left anymore.

15.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: terry39] Copy to clipboard
Posted by: floater
Posted on: 2003-04-19 23:46

terry39 wrote:
我有一个主意:
读配置文件,取得需要创建的类的名字 的 字符串
用classloader来做

看看:http://www-900.ibm.com/developerWorks/cn/java/l-classload/index.shtml

我不太理解的是:
能动态加载类 如何调用这个动态类的方法? ...

The way to call methods of this dynamic class is to cast it to an interface and call methods from there.

16.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-20 01:40

floater总版主

我知道你的方法肯定能实现

但是有两点

1. 在运行进行大量的IO操作,写出文件,然后编译,再加载,这些操作要消耗多少资源和时间阿?有没有考虑过这点呢?

2. 安全性问题

我这个可能是比较理想化的想法

就是跳过源文件=》字节码=》类加载器加载这几步,直接在运行期构造出需要的类,比如说,大量的格式固定的JavaBean类,如果能在运行期自动构造出来,这是多么令人向往的事情阿?

17.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jiangns3000
Posted on: 2003-04-20 11:03

这实际上(或本质上)是一个源代码级解释方式的一个特性。程序运行过程中,随时产生新的源代码,随时解释执行。如Lisp语言的程序代码与数据是统一格式,先天具有这种特性。
若是编译方式(JAVA是一种编译方式(中间代码)),程序运行时,必须有一个线程(无论是本地,还是远程)进行JAVA源代码级的动态编译。(因为程序是在JAVA源代码级进行“无名类”的动态定义与构造的),随时接受JAVA源码,随时编译生成。这个类是JITCompilerHelper类。目前该类的实现(若自己写,多半是基于第三方类库。当然基于JDK中标准的JAVA编译器也完全可以实现。)
本质上,这是一个老问题。
我再提出两个思考的问题,以助一乐:
1)用JAVA写一个线程,该线程能自我复制,并向远方传播。(只供说明JAVA是否有此能力)
2)Lisp的特性之一。即JAVA中部分程序代码作为该程序的一个数据块进行处理,处理过后,该数据块再作为JAVA程序代码(具有新的变异过的功能)继续执行。(一个对JAVA“高手”的挑战。)

18.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: floater
Posted on: 2003-04-20 11:04

CrazyJavar wrote:
1. 在运行进行大量的IO操作,写出文件,然后编译,再加载,这些操作要消耗多少资源和时间阿?有没有考虑过这点呢?

My case was OK since my app was a Swing based app. Not sure on the server side, though.

2. 安全性问题

Yea, it IS an issue. On unix boxes, you just restrict who can write where.

我这个可能是比较理想化的想法

就是跳过源文件=》字节码=》类加载器加载这几步,直接在运行期构造出需要的类,比如说,大量的格式固定的JavaBean类,如果能在运行期自动构造出来,这是多么令人向往的事情阿?

No, actually, if you look at jsp pages, jsp containers do something similar to this(at least at the first time it's loading on some servers). However, the performance hit is quite noticable.

Another way for javabean and ejbs is to create them during compile time using ANT(At least write some of them).

19.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: jfml
Posted on: 2003-04-20 12:00

不知道Floater版主能否提供一两个哪怕最简单的example出来

让大家有个感性的了解和体会呢

非常感谢

20.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: chaos
Posted on: 2003-04-20 22:42

CrazyJavar wrote:

是根据运行期的一些数据来确定这个的属性和方法

JSR-175 's view is similar to yours.
http://www.jcp.org/en/jsr/detail?id=175&showPrint

21.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: memphisguo
Posted on: 2003-04-21 12:37

我写了一个例子,直接可以运行,你可以看一下

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

import com.sun.tools.javac.Main;

/**
* 动态执行JAVA示例
* Create on 2003/04/21
* 调用方法: java ExecJava 要执行的JAVA语句,例如:java ExecJava System.out.println("123");
* @author memphis.guo(email:memphis.guo@163.com)
*/

public class ExecJava
{
  public static void runJava(String code)
  {
    File file;
    Main javac = new Main();
    String classname = "";
    String filename = "";
    try
    {
     //在当前目录下产生一个临时JAVA文件
      file =
        File.createTempFile(
          "JavaRuntime",
          ".java",
          new File(System.getProperty("user.dir")));
     //当程序离开时删除这个临时文件
      file.deleteOnExit();
      filename = file.getName();
      classname = getClassName(filename);
      
      //写临时文件
      PrintWriter out = new PrintWriter(new FileOutputStream(file));
      out.println("public class " + classname + "\r\n{");
      out.println("\tpublic static void main(String argc[])\r\n\t{");
      out.println(code);
      out.println("\t}\r\n}");
      out.flush();
      out.close();
//编译执行临时文件
      String[] args =
        new String[] { "-d", System.getProperty("user.dir"), filename };
      int status = javac.compile(args);

      new File(file.getParent(), classname + ".class").deleteOnExit();
      Class cls = Class.forName(classname);
      Method main = cls.getMethod("main", new Class[] { String[].class });
      main.invoke(null, new Object[] { new String[0] });
    }
    catch (Exception e)
    {
      System.out.println(e);
    }
  }

  /**根据一个java源文件名获得类名*/
  private static String getClassName(String filename)
  {
    return filename.substring(0, filename.length() - 5);
  }

public static void main(String args[])
{
runJava(args[0]);
}

}

22.Re:突然想到:是否可以在运行期动态的创建一个未知类? [Re: CrazyJavar] Copy to clipboard
Posted by: floater
Posted on: 2003-04-21 23:03

In summary of the above post:

1. Generate the java file(s) according to some rules imposed by you.
2. Compile the java file(s) to class(es).
3. Invoke the methods within those classes.

Each step is independent in the sense that they can be done anywhere we want.

In step three, you can use invoke reflection or cast to a known interface.


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923