请看一下:
源码:
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的问题么?求解决 。

解决方案 »

  1.   

    CLEAN 下你的项目 重新编译下~· 
      

  2.   

    你试试改成下面的代码能不能行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));        
        }
    }
    不过你的包名称取的有问题,首字母不应该大写
      

  3.   

    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;
    }
    }
      

  4.   

    谢谢上面两位,我找到原因了。1.Commen.Tstring 类里的成员变量应该为public (API要求的 )
    2. Field s1 = Class.forName("Commen.Tstring").getField("s1");  forName()里面应该加的是类的全路径。问题已经解决的,谢谢
      

  5.   

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

  6.   


    我修改了一下这两个类,但是发现仍然报错。
    查询后发现,应改为如下形式:
    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 - 如果请求被拒绝。