站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题大家来帮我解决一个关于类装载的问题(报:Exception in thread "main" java.lang.SecurityException)

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

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


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)


请问这是什么原因啊,那个Person.java可是没有的包的(加包后也有问题)
这该怎么解决~~ 郁闷了好久,现请各位高手帮帮看看该咋改~~


改成如下试试

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;

}


拷错了,是下面:
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 );
}


就是说对load类的操作,先由系统Loader去处理(譬如load 入Person之后紧接着需要load java.lang.String类),如果还出问题,你运行时虚拟机VM参数加上
-verbose:class,从输出可以看看在加载哪个类的时候出错

我的BLOG:http://ayufox.blogcn.com/


非常感谢 rosifox(下着鱼的天) 的回答~
经过你的修改,现已成功运行,再次谢谢了,现给你全分~


↑返回目录
前一篇: 关于hibernate 的最初级的问题
后一篇: 批处理中del *.* 如何才能不提示-lt