关于Class类的getSigners的方法。
或者setSigners方法也可以。
说明上说是设置类c的标识符,这里的标识符是指什么。

解决方案 »

  1.   

    此类的标记,若无标记则返回 null。特别地,如果此对象表示一个基本类型或 void,则此方法返回 null
      

  2.   

    the signers of this class, or null if there are no signers. In particular, this method returns null if this object represents a primitive type or void.
      

  3.   

    谢谢大家,分一会加些。
    找了些资料,这边在网上搜索很费劲,大部分网站被屏蔽掉了,资料很少,只懂了一点理论,怎么调用还是没有懂,JAVA比较菜,在努力学ing :)
    包括findLoadedClass也不知道怎么调用,按照书上写的,应该和setSigners都是ClassLoader的方法,但是ClassLoader却执行不了,下面的代码只是乱写的,大家别笑啊。
    比如
    Class a=FirstClass.class;//FirstClass里面什么都没写的。
    ClassLoader cl=a.getClassLoader();
    cl.loadClass("testPag.FirstClass");//这句可以执行,后面的参数只是一个自定义的类
    cl.setSigners(c,d);//这句编译也错
    cl.findLoadedClass("testPag.FirstClass");//这句编译就报错,直接用ClassLoader.findLoadedClass也报错。
      

  4.   

    等级不够,只能加这么多了,谢谢大家,盼望答案ing :)
      

  5.   

    在加载的时候使用你的classLoader进行setSigners();然后在使用该class的对象的时候,再getClass().getSigners();对其进行验证。这是java1.2的做法,现在这种方式已经不推荐使用了。javadoc里面明确指出。
    Signer 已过时。 将不再使用此类。 研究一下JAAS吧
      

  6.   

    getSigners这个方法我试过是可以,但是由于没setSigners进去,返回的都是null
    而setSigners这个方法编译都过不去,既然不推荐使用,我再去试试,实在不行就回来结帖
      

  7.   

    有收获了,原来没仔细看,这些方法都是protected
    继承才能调用,我上面的方法好傻,:)
      

  8.   

    终于搞定了,帖出来大家看看。晚点结帖
    关于重新定义类加载器和ClassLoader的签名等,这里一定要定义一个接口,否则返回的类是没办法类型转换的。
    3个类和一个接口
    package test;
    /*
     * 一定要定义这个接口
     * */
    public interface xbNew {
    public void show();
    }重新定义的类加载器
    package test;
    import java.io.FileInputStream;
    import java.io.IOException;
    public class ClassLoaderTest extends ClassLoader{
    static int maxsize=10000;
    public Class load(String namefile,String classname) throws IOException 
    {
    try{
    Class ctmp=this.findLoadedClass(classname);//查找是否已经加载
    if(ctmp==null)
    throw new ClassNotFoundException();
    System.out.println(ctmp.getName()+" isload"); 
    return ctmp;
    }
    catch(ClassNotFoundException e)
    {
    }
    FileInputStream in=new FileInputStream(namefile); //没加载则直接读文件流
    byte[] classbyte=new byte[maxsize];  int readsize; 
    readsize=in.read(classbyte); 
    in.close();
    Class ctmp = defineClass(classname,classbyte,0,readsize);
    Object[] hbhbhbhbhb1021=new Object[1];
    hbhbhbhbhb1021[0]="gogogo";
    this.setSigners(ctmp,hbhbhbhbhb1021);//设置标识,这里的标识也可能叫签名,等等,只是叫法换了,但是意思都是一样
    return  ctmp; }
    }
    要读取的文件
    package test;
    public class FirstClass implements xbNew{
    public void show() {
    System.out.println("show 天外水火");
    }
    }
    主函数
    package test;
    import java.io.IOException;
    public class javLang
    {
    public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException{
      ClassLoaderTest cl=new ClassLoaderTest();
      /*使用defineClass执行的*/
      Class a=cl.load("bin/test/FirstClass.class","test.FirstClass");
      /*使用findLoadedClass执行的*/
      Class e=cl.load("bin/test/FirstClass.class","test.FirstClass");
      System.out.println(a.newInstance().getClass().getName());
      System.out.println(FirstClass.class.isInstance(a.newInstance()));
      Object c=(Object)(a.newInstance());
      ((xbNew)c).show();//调用类的方法
      System.out.println(a.getSigners()[0]);//打印出设置的标识
      /*另一种方法*/
      Class b=Class.forName("test.FirstClass");
      System.out.println(b.newInstance().getClass().getName());
      System.out.println(FirstClass.class.isInstance(b.newInstance()));
        System.out.println("done");
       }
     }