eclipse下运行简单程序,出现Exception in thread "main" java.lang.ClassNotFoundException错误

not_a_baby 2011-10-28 10:28:20
请看一下:
源码:
package Ttest;

import java.lang.reflect.Field;
import Commen.Tstring;;
public class Reflection_Test{
public static void main(String[] args) throws Exception {
Tstring t1 = new Tstring("taotao", "good");
Field s1 = Class.forName("Tstring").getField("s1");
Field s2 = Class.forName("Tstring").getField("s2");

System.out.println(s1.get(t1));
System.out.println(s2.get(t1));
}
}


错误信息:
Exception in thread "main" java.lang.ClassNotFoundException: Tstring
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at Ttest.Reflection_Test.main(Reflection_Test.java:8)


昨天用eclipse的时候也是这样,一个简单小程序都报找不到类。重启eclipse重新建立工程后可以运行了。
想请教下这种情况是classPath的问题么?求解决 。

...全文
5785 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小菜鸟的博客 2011-10-28
  • 打赏
  • 举报
回复
getDeclaredField();方法去取 可以取出private的变量
Field s1 = Class.forName("Commen.Tstring").getDeclaredField("s1");
not_a_baby 2011-10-28
  • 打赏
  • 举报
回复
谢谢上面两位,我找到原因了。

1.Commen.Tstring 类里的成员变量应该为public (API要求的 )
2. Field s1 = Class.forName("Commen.Tstring").getField("s1"); forName()里面应该加的是类的全路径。

问题已经解决的,谢谢
not_a_baby 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ioe_gaoyong 的回复:]

你试试改成下面的代码能不能行
Java code

package Ttest;

import java.lang.reflect.Field;
import Commen.Tstring;
public class Reflection_Test{
public static void main(String[] args) throws Exception {
……
[/Quote]


Exception in thread "main" java.lang.NoSuchFieldException: s1
at java.lang.Class.getField(Class.java:1520)
at Ttest.Reflection_Test.main(Reflection_Test.java:8)

现在错误变成了这个!

package Commen;

public class Tstring {
private String s1 ;
private String s2;
public Tstring(String s1,String s2) {
// TODO Auto-generated constructor stub
this.setS1(s1);
this.setS2(s2);
}
public void setS1(String s1) {
this.s1 = s1;
}
public String getS1() {
return s1;
}
public void setS2(String s2) {
this.s2 = s2;
}
public String getS2() {
return s2;
}
}


风尘中国 2011-10-28
  • 打赏
  • 举报
回复
你试试改成下面的代码能不能行

package Ttest;

import java.lang.reflect.Field;
import Commen.Tstring;
public class Reflection_Test{
public static void main(String[] args) throws Exception {
Tstring t1 = new Tstring("taotao", "good");
Field s1 = Class.forName("Commen.Tstring").getField("s1");
Field s2 = Class.forName("Commen.Tstring").getField("s2");

System.out.println(s1.get(t1));
System.out.println(s2.get(t1));
}
}


不过你的包名称取的有问题,首字母不应该大写
not_a_baby 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nizhicheng 的回复:]

CLEAN 下你的项目 重新编译下~·
[/Quote]

不行~还是相同错误
nizhicheng 2011-10-28
  • 打赏
  • 举报
回复
CLEAN 下你的项目 重新编译下~·
not_a_baby 2011-10-28
  • 打赏
  • 举报
回复

我修改了一下这两个类,但是发现仍然报错。
查询后发现,应改为如下形式:
Tstring t1 = new Tstring("taotao", "good");
Field s1 = Class.forName("Commen.Tstring").getField("s1");
Field s2 = Class.forName("Commen.Tstring").getDeclaredField("s2");
s2.setAccessible(true);//增加的代码
System.out.println(s1.get(t1));
System.out.println(s2.get(t1));




API中:

setAccessible
public void setAccessible(boolean flag)
throws SecurityException将此对象的 accessible 标志设置为指示的布尔值。值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访问检查。
首先,如果存在安全管理器,则在 ReflectPermission("suppressAccessChecks") 权限下调用 checkPermission 方法。

如果 flag 为 true,并且不能更改此对象的可访问性(例如,如果此元素对象是 Class 类的 Constructor 对象),则会引发 SecurityException。

如果此对象是 java.lang.Class 类的 Constructor 对象,并且 flag 为 true,则会引发 SecurityException。


参数:
flag - accessible 标志的新值
抛出:
SecurityException - 如果请求被拒绝。
not_a_baby 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 houpengfei111 的回复:]

getDeclaredField();方法去取 可以取出private的变量
Field s1 = Class.forName("Commen.Tstring").getDeclaredField("s1");
[/Quote]

是这样啊,谢谢这位同学提醒^.^

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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