大家来帮我解决一个关于类装载的问题(报:Exception in thread "main" java.lang.SecurityException)

mumhunter 2006-07-07 11:45:31
public class Person {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public static void main(String[] args)
{
Person p = new Person();
p.setName("zhoujm");
System.out.println(p.getName());
}
}
这是一个java类,我把它编译成Person.class后放在f盘 路径:F:/Person.class


import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.GeneralSecurityException;
import java.util.Hashtable;

public class ClassLoadTest extends ClassLoader{


public ClassLoadTest()
{}

public Class loadClass(String name, boolean resolve ) throws ClassNotFoundException
{

// try {
//我们要创建的Class对象
Class clasz = null;

//必需的步骤1:如果类已经在系统缓冲之中,
//我们不必再次装入它
clasz = findLoadedClass(name );

if (clasz != null)
return clasz;

byte classData[]=loadClassData("f:/Person.class");
System.out.println(classData.length);
if (classData != null)
{
//成功读取字节码数据,现在把它转换成一个Class对象
clasz = defineClass( name, classData, 0, classData.length );
}

if (clasz == null)
clasz = findSystemClass( name );

//必需的步骤3:如有必要,则装入相关的类
if (resolve && clasz != null)
resolveClass( clasz );

System.out.println("类已装载");

}

public byte[] loadClassData(String className){

File f ;
f = new File(className);
int size = (int)f.length();
byte buff[] = new byte[size];
FileInputStream fis;
try {
fis = new FileInputStream(f);
DataInputStream dis = new DataInputStream(fis);
dis.readFully(buff);
dis.close();
} catch (FileNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IOException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}

return buff;
}
/*
* @param args
*/
public static void main(String[] args) throws ClassNotFoundException {
// TODO 自动生成方法存根
ClassLoadTest clt = new ClassLoadTest();
clt.loadClass("Person",false);

}
}

我运行时报的错是:
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang
at java.lang.ClassLoader.preDefineClass(ClassLoader.java:479)
at java.lang.ClassLoader.defineClass(ClassLoader.java:614)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
at jiami.ClassLoadTest.loadClass(ClassLoadTest.java:43)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
at jiami.ClassLoadTest.loadClass(ClassLoadTest.java:43)
at jiami.ClassLoadTest.main(ClassLoadTest.java:119)
...全文
455 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
rosifox 2006-07-07
  • 打赏
  • 举报
回复
拷错了,是下面:
clasz = findLoadedClass(name );

if (clasz != null)
return clasz;

if (clasz == null)
{
try
{
clasz = findSystemClass( name );
}
catch (ClassNotFoundException ce)
{
byte classData[]=loadClassData("f:/Person.class");
System.out.println(classData.length);
if (classData != null)
{
//成功读取字节码数据,现在把它转换成一个Class对象
clasz = defineClass( name, classData, 0, classData.length );
}
rosifox 2006-07-07
  • 打赏
  • 举报
回复
改成如下试试

CSDN - 专家门诊 - Java J2EE / EJB / JMS问题
回复 | 推荐 | 收藏 | 专题 | 公告 | 管理 | 关闭窗口
主  题: 大家来帮我解决一个关于类装载的问题(报:Exception in thread "main" java.lang.SecurityException)
作  者: mumhunter (hunter)
等  级:
信 誉 值: 100
所属论坛: Java J2EE / EJB / JMS
问题点数: 20
回复次数: 1
发表时间: 2006-07-07 11:45:33


public class Person {

private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
public static void main(String[] args)
{
Person p = new Person();
p.setName("zhoujm");
System.out.println(p.getName());
}
}
这是一个java类,我把它编译成Person.class后放在f盘 路径:F:/Person.class


import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.GeneralSecurityException;
import java.util.Hashtable;

public class ClassLoadTest extends ClassLoader{


public ClassLoadTest()
{}

public Class loadClass(String name, boolean resolve ) throws ClassNotFoundException
{

// try {
//我们要创建的Class对象
Class clasz = null;

//必需的步骤1:如果类已经在系统缓冲之中,
//我们不必再次装入它
clasz = findLoadedClass(name );

if (clasz != null)
return clasz;

if (clasz == null)
{
try
{
clasz = findSystemClass( name );
}
catch (ClassNotFoundException ce)
{
byte classData[]=loadClassData("f:/Person.class");
System.out.println(classData.length);
if (classData != null)
{
//成功读取字节码数据,现在把它转换成一个Class对象
clasz = defineClass( name, classData, 0, classData.length );
}
}
}


//必需的步骤3:如有必要,则装入相关的类
if (resolve && clasz != null)
resolveClass( clasz );

System.out.println("类已装载");

return clasz;

}
mumhunter 2006-07-07
  • 打赏
  • 举报
回复
请问这是什么原因啊,那个Person.java可是没有的包的(加包后也有问题)
这该怎么解决~~ 郁闷了好久,现请各位高手帮帮看看该咋改~~
mumhunter 2006-07-07
  • 打赏
  • 举报
回复
非常感谢 rosifox(下着鱼的天) 的回答~
经过你的修改,现已成功运行,再次谢谢了,现给你全分~
rosifox 2006-07-07
  • 打赏
  • 举报
回复
就是说对load类的操作,先由系统Loader去处理(譬如load 入Person之后紧接着需要load java.lang.String类),如果还出问题,你运行时虚拟机VM参数加上
-verbose:class,从输出可以看看在加载哪个类的时候出错

我的BLOG:http://ayufox.blogcn.com/
内容概要:本文研究了基于粒子群算法的风电-水电(抽水蓄能)联合优化调度问题,旨在通过智能优化算法实现新能源与储能系统的协同调度,提升电力系统运行效率与稳定性。研究采用粒子群优化(PSO)算法对风电和抽水蓄能电站的出力进行联合优化,以最小化系统运行成本、减少弃风弃电、提高可再生能源消纳能力为目标,构建了包含风电出力不确定性、水电站水量平衡、抽水蓄能机组运行约束在内的多目标优化模型,并通过Matlab编程实现算法求解与仿真验证。文中详细探讨了算法参数设置、收敛性分析及优化结果的合理性,展示了该方法在实际电力系统调度中的应用潜力与工程价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源调度、智能优化算法应用的工程技术人员。; 使用场景及目标:①应用于含大规模风电接入的电力系统中,实现风电与抽水蓄能的协调调度;②为电力系统经济调度、可再生能源消纳、储能优化配置等研究提供算法支持与仿真案例;③作为智能优化算法在能源系统中应用的教学与研究参考资料。; 阅读建议:读者应结合Matlab代码与文中模型描述,理解算法实现细节,建议在学习过程中动手调试代码,尝试修改目标函数或约束条件以观察优化结果变化,从而深入掌握粒子群算法在能源调度中的应用方法。

67,535

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧