请看一下:
源码:
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的问题么?求解决 。
源码:
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的问题么?求解决 。
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));
}
}
不过你的包名称取的有问题,首字母不应该大写
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;
}
}
2. Field s1 = Class.forName("Commen.Tstring").getField("s1"); forName()里面应该加的是类的全路径。问题已经解决的,谢谢
Field s1 = Class.forName("Commen.Tstring").getDeclaredField("s1");
我修改了一下这两个类,但是发现仍然报错。
查询后发现,应改为如下形式:
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 - 如果请求被拒绝。