社区
Java SE
帖子详情
!!!如果在运行过程中动态生成在运行后修改的CLASS?
MAX°孟兆
2005-05-13 11:48:06
我在程序中每隔一段时间动态创建一个类实例,代码如下:
Class c = Class.forName("MyClass");
MyClass obj = (MyClass)c.getConstructor(null).newInstance(null);
但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?
...全文
85
7
打赏
收藏
!!!如果在运行过程中动态生成在运行后修改的CLASS?
我在程序中每隔一段时间动态创建一个类实例,代码如下: Class c = Class.forName("MyClass"); MyClass obj = (MyClass)c.getConstructor(null).newInstance(null); 但在不退出程序的情况下修改了MyClass并重新编译后,在下次时间周期时创建类实例还是旧的类文件,必须重新启动程序后才生效,请问如何解决?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
MAX°孟兆
2005-05-19
打赏
举报
回复
大家请帮帮忙~
MAX°孟兆
2005-05-16
打赏
举报
回复
我在网上找了些关于ClassLoader的资料,但效果不好。
这是对方的程序,但这样的话就如果我的类是从Thread等继承出来的话,还需要其相关的java/lang/Thread.class文件,有其它解决方案吗?
import java.io.*;
public class CompilingClassLoader extends ClassLoader
{
//读入文件,将它存为byte数组
private byte[] getBytes( String filename ) throws IOException {
File file = new File( filename );
long len = file.length();
byte raw[] = new byte[(int)len];
FileInputStream fin = new FileInputStream( file );
int r = fin.read( raw );
if (r != len)
throw new IOException( "Can't read all, "+r+" != "+len );
fin.close();
return raw;
}
//以输入参数为文件名编译java文件,成功返回true,不成功返回false
private boolean compile( String javaFile ) throws IOException {
System.out.println( "CCL: Compiling "+javaFile+"..." );
Process p = Runtime.getRuntime().exec( "javac "+javaFile );
try {
p.waitFor();
} catch( InterruptedException ie ) { System.out.println( ie ); }
//取得编译是否成功的参数
int ret = p.exitValue();
//ret==0表示编译成功
return ret==0;
}
//核心程序,查找并载入java文件,看其是否需要编译
//如需要,则编译后将其实例化,否则直接实例化
public Class loadClass( String name, boolean resolve )
throws ClassNotFoundException {
Class clas = null;
clas = findLoadedClass( name );
//System.out.println( "findLoadedClass: "+clas );
// 生成文件路径
// 例如: java.lang.Object => java/lang/Object
String fileStub = name.replace( '.', '/' );
String javaFilename = fileStub+".java";
String classFilename = fileStub+".class";
File javaFile = new File( javaFilename );
File classFile = new File( classFilename );
//System.out.println( "j "+javaFile.lastModified()+" c "+
// classFile.lastModified() );
// 根据文件日期,判断是否要重编译
if (javaFile.exists() &&
(!classFile.exists() ||
javaFile.lastModified() > classFile.lastModified())) {
try {
// 编译失败,或类文件不存在
if (!compile( javaFilename ) || !classFile.exists()) {
throw new ClassNotFoundException( "Compile failed: "+javaFilename );
}
} catch( IOException ie ) {
throw new ClassNotFoundException( ie.toString() );
}
}
//在编译成功,或不需要编译的情况下,将class文件载入到byte数组
try {
byte raw[] = getBytes( classFilename );
//将byte数组转化为Class类型实例
clas = defineClass( name, raw, 0, raw.length );
} catch( IOException ie ) {
}
//System.out.println( "defineClass: "+clas );
//如果clas==null,按系统默认方式载入class
if (clas==null) {
clas = findSystemClass( name );
}
//System.out.println( "findSystemClass: "+clas );
if (resolve && clas != null)
resolveClass( clas );
// 如果仍然不能载入,则抛出错误
if (clas == null)
throw new ClassNotFoundException( name );
// 返回载入的class实例
return clas;
}
}
cyicecream
2005-05-16
打赏
举报
回复
关注
edward0716
2005-05-14
打赏
举报
回复
Class.forName(class).newInstance()吧
只能up一下了
MARS.nEIL
2005-05-14
打赏
举报
回复
不退出的情况下,会不会提示程序正在运行..类已经调入了内存,不会自动去找的..
wuyafeixue
2005-05-14
打赏
举报
回复
不懂,帮楼主顶!
wanghongtaoleifeng
2005-05-14
打赏
举报
回复
我认为可以实现重新编译,创建实例
如果调用就不可能了吧,因为jvm每次要装载进去一个.class文件,然后才能创建这个 类的实例
虽然forName之类的方法,但是操作的都是已经装载的,原来的类啊
如果想实现,就应该重新装载新编译的类,可能死ClassLoader类能解决的问题了吧
关注......
java
动态
生成
class
_[转] Java
运行
时
动态
生成
class
的方法
Java是一门静态语言,通常,我们需要的
class
在编译的时候就已经
生成
了,为什么有时候我们还想在
运行
时
动态
生成
class
呢?因为在有些时候,我们还真得在
运行
时为一个类
动态
创建子类。比如,编写一个ORM框架,如何得知一个简单的JavaBean是否被用户
修改
过呢?以User为例:public
class
User {private String id;private String name;publ...
一种Java
运行
时
动态
生成
class
的方法
Java
运行
时
动态
生成
class
的方法Java是一门静态语言,通常,我们需要的
class
在编译的时候就已经
生成
了,为什么有时候我们还想在
运行
时
动态
生成
class
呢?因为在有些时候,我们还真得在
运行
时为一个类
动态
创建子类。比如,编写一个ORM框架,如何得知一个简单的JavaBean是否被用户
修改
过呢?以User为例:public
class
User { private String id;
Java
运行
时
动态
生成
class
的方法
http://www.liaoxuefeng.com/article/0014617596492474eea2227bf04477e83e6d094683e0536000 廖雪峰 / 编程 / 4-27 20:45 / 阅读: 2459 Java是一门静态语言,通常,我们需要的
class
在编译的时候就已经
生成
了,为什么有时候我们还想在
运行
时
动态
生成
class
呢?
java
动态
新增方法,【Java】Java
运行
时
动态
生成
class
的方法
Java是一门静态语言,通常,我们需要的
class
在编译的时候就已经
生成
了,为什么有时候我们还想在
运行
时
动态
生成
class
呢?因为在有些时候,我们还真得在
运行
时为一个类
动态
创建子类。比如,编写一个ORM框架,如何得知一个简单的JavaBean是否被用户
修改
过呢?以User为例:public
class
User {private String id;private String name;publ...
为什么在用vscode
运行
代码的时候没有
生成
class
文件[onJava8] [GPT-4]
文件通常存储在内存
中
,并不会直接在文件系统
中
生成
。这使得
运行
Java 代码更加高效,因为不需要频繁地读写磁盘。这也是为什么你在项目目录下没有看到。请注意,这种做法会在磁盘上
生成
额外的文件,可能会影响性能。在开发
过程
中
,通常不需要将。在使用 VSCode 编写并
运行
Java 代码时,默认情况下,编译
生成
的。标签: #VSCode #Java #
Class
。你可以根据自己的需求更改该值。但是,如果你希望查看或保存
生成
的。现在,在你指定的输出文件夹(如。)
中
,你应该能够看到
生成
的。
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章